IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Передача динамического массива из dll в приложение (https://www.imho.ws/showthread.php?t=103974)

lyuq 22.05.2006 18:10

Передача динамического массива из dll в приложение
 
Возник затык, так сказать, не могу сообразить как организовать передачу динамического массива из dll в приложение. Причем передача данных должна проходить в режиме реального времени, т.е. как только в массиве появляется новый элемент, он тут же толжен быть передан в приложение.

Забыл добавить, все пишется на Delphi.

Kvarx 22.05.2006 18:29

Не имел особо дел с дллбками, но на лабах по осям, для передачи данных между процессами использовали Pipes (каналы).

Цитата:

Сообщение от lyug
в массиве появляется новый элемент, он тут же толжен быть передан в приложение

Процесс, осуществляющий попытку чтения из пустого канала, будет приостановлен, пока там не появятся данные.

Если заинтересовался, то смотри в MSDN: CreatePipe, ReadFile, WriteFile.

Gunslinger 22.05.2006 20:04

Цитата:

Kvarx:
Если заинтересовался, то смотри в MSDN: CreatePipe, ReadFile, WriteFile.
Так как человек пишет на Delphi, MSDN навряд поможет.

А так сообствено говоря Pipes в .нете решают такие задачи, также можно передавать по tcp-каналам. Наверняка в дельфи что-то подобное должно быть

lyuq 22.05.2006 23:31

Kvarx, Gunslinger - пасиб.

Тогда еще такой вопрос, с какой скоростью просходит обращение к каналам? Новые элементы в массиве могут появляться со скоростью до 50 шт/с, соответственно суммарное (запись + чтение) время обращения в каналу должно быть меньше 20 мс.

З.Ы. Kvarx, у меня ник lyuq, последняя q, а не g.

MrSerg 23.05.2006 16:57

Быстро из своей dll в приложение данные можно переслать так:

Приложение передает в dll адрес процедуры своего обработчика новых данных.
Как только dll получает новые данные, сразу вызывает обработчик приложения.
Параметрами обработчика может быть указатель на динамический массив, простого копирования данных внутри одного процесса вполне достаточно.

Если непонятно могу напасать небольшой пример программы.

lyuq 24.05.2006 11:25

MrSerg
Пасиб!
Напиши, plz, небольшой пример программы.

MrSerg 24.05.2006 13:16

Небольшой пример:
Код:

// основная программа
// описание процедуры вашей dll
procedure initdll(adr : pointer); external 'mydll.dll' name 'initdll';

Type buf=array of byte;
      Tbuf=^buf;
Var  mybuf:array[0..1000] of byte;       

//  процедура обработчика
//  p- указатель на массив данных
//  len- длинна массива данных
procedure newdata(p:Tbuf;len:dword);
begin
if  IsBadReadPtr(p,len) then exit;
// обработка данных
For i:=1 to len do mybuf[i]:=p^[i];
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
// передача в dll адреса обработчика.
Initdll(addr(newdata));

// конец основной программы


// программа dll
library mydll;
uses SysUtils,windows;

Type Tbac= procedure newdata(p : pointer;len:dword);
Var  bac:tbac=nil;
    Buf:array[0..1000] of byte;       

// сдесь ваша dll получает адрес procedure newdata
Procedure Initdll(adr : pointer);
Begin
// инициализация
bac:=adr;
End;



// где то здесь вы получаете новые данные
// и если  инициализация была передаете данные
if addr(bac)<>nil then bac(@buf,length(buf));



Exports
Initdll;

Begin
End.



Часовой пояс GMT +4, время: 21:27.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.