Передача двоичных данных в функцию dll в D7 - PullRequest
4 голосов
/ 15 февраля 2012

Может ли кто-нибудь предоставить мне рабочий пример передачи произвольного числа байтов через параметр к функции dll?

Я хотел бы сделать это без какого-либо дополнительного блока памяти, просто работать только с основными типами окон.

Мне нужно «отправлять» около 300 КБ данных за каждый вызов.

Должна ли память, выделенная на стороне клиента, быть свободной и на стороне клиента?

1 Ответ

7 голосов
/ 15 февраля 2012

Функция DLL должна выглядеть следующим образом:

procedure Test(Buffer: Pointer; Length: Integer); stdcall;
begin
  //Buffer points to the start of the buffer. 
  //The Buffer size if Length bytes.
end;

Если вы вызываете ее из другого модуля Delphi, вызов может выглядеть следующим образом:

procedure Test(Buffer: Pointer; Length: Integer); stdcall; external 'test.dll';

procedure CallTest;
var
  Buffer: array of Byte;
begin
  SetLength(Buffer, 1000);
  //populate Buffer
  Test(@Buffer[0], Length(Buffer));
end;

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

Вышеприведенный пример выделяет и освобождает в модуле вызывающего.Это означает, что метод Test должен будет либо полностью обработать Buffer перед возвратом, либо взять копию содержимого Buffer перед возвратом.

Теперь, хотя можно получитьразмещение и освобождение в модуле вызываемого, это менее распространено.Это менее распространено, потому что обычно это менее удобно делать таким образом.Это часто влечет за собой больше функций API или, возможно, более сложный интерфейс.Вы будете втянуты в маршрут распределения вызываемого абонента, когда вызывающий абонент не может определить подходящий размер для буфера.

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

...