| imho.ws |
![]() |
|
|
|||||||
|
Сообщения:
Перейти к новому /
Последнее
|
Опции темы |
|
|
# 1 |
|
Member
Регистрация: 15.06.2003
Адрес: underneath it all
Пол: Male
Сообщения: 348
![]() ![]() ![]() |
Передача динамического массива из dll в приложение
Возник затык, так сказать, не могу сообразить как организовать передачу динамического массива из dll в приложение. Причем передача данных должна проходить в режиме реального времени, т.е. как только в массиве появляется новый элемент, он тут же толжен быть передан в приложение.
Забыл добавить, все пишется на Delphi.
__________________
Сердце раскололось на тысячи искр, разжигая огонь угасающих глаз, бесконечно смотрящих на холодный свет звезд, не знающих страсти, любви и печали.(c)я Последний раз редактировалось lyuq; 22.05.2006 в 19:15. |
|
|
|
|
# 2 | |
|
Member
Регистрация: 26.09.2005
Адрес: Питер
Сообщения: 336
![]() ![]() |
Не имел особо дел с дллбками, но на лабах по осям, для передачи данных между процессами использовали Pipes (каналы).
Цитата:
Если заинтересовался, то смотри в MSDN: CreatePipe, ReadFile, WriteFile. |
|
|
|
|
|
# 3 | |
|
Advanced Member
Регистрация: 15.09.2004
Адрес: Украина, Хмельницкий
Сообщения: 403
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
А так сообствено говоря Pipes в .нете решают такие задачи, также можно передавать по tcp-каналам. Наверняка в дельфи что-то подобное должно быть
__________________
The man in black fled across the desert, and the Gunslinger followed. (c) S.King |
|
|
|
|
|
# 4 |
|
Member
Регистрация: 15.06.2003
Адрес: underneath it all
Пол: Male
Сообщения: 348
![]() ![]() ![]() |
Kvarx, Gunslinger - пасиб.
Тогда еще такой вопрос, с какой скоростью просходит обращение к каналам? Новые элементы в массиве могут появляться со скоростью до 50 шт/с, соответственно суммарное (запись + чтение) время обращения в каналу должно быть меньше 20 мс. З.Ы. Kvarx, у меня ник lyuq, последняя q, а не g.
__________________
Сердце раскололось на тысячи искр, разжигая огонь угасающих глаз, бесконечно смотрящих на холодный свет звезд, не знающих страсти, любви и печали.(c)я Последний раз редактировалось lyuq; 22.05.2006 в 23:34. |
|
|
|
|
# 5 |
|
Guest
Сообщения: n/a
|
Быстро из своей dll в приложение данные можно переслать так:
Приложение передает в dll адрес процедуры своего обработчика новых данных. Как только dll получает новые данные, сразу вызывает обработчик приложения. Параметрами обработчика может быть указатель на динамический массив, простого копирования данных внутри одного процесса вполне достаточно. Если непонятно могу напасать небольшой пример программы. |
|
|
# 6 |
|
Member
Регистрация: 15.06.2003
Адрес: underneath it all
Пол: Male
Сообщения: 348
![]() ![]() ![]() |
MrSerg
Пасиб! Напиши, plz, небольшой пример программы.
__________________
Сердце раскололось на тысячи искр, разжигая огонь угасающих глаз, бесконечно смотрящих на холодный свет звезд, не знающих страсти, любви и печали.(c)я |
|
|
|
|
# 7 |
|
Guest
Сообщения: n/a
|
Небольшой пример:
Код:
// основная программа
// описание процедуры вашей 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.
|