Небольшой пример:
Код:
// основная программа
// описание процедуры вашей 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.