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