Функция 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 или, возможно, более сложный интерфейс.Вы будете втянуты в маршрут распределения вызываемого абонента, когда вызывающий абонент не может определить подходящий размер для буфера.
Когда данные передаются от вызывающего к вызываемому абоненту, чем выделение вызывающего абонента неизменно является лучшим выбором.Когда данные передаются в другом направлении, более вероятно, что распределение вызываемого абонента будет уместным.