У меня есть DLL, которая обеспечивала функцию декодирования следующим образом:
function MyDecode (Source: PChar; SourceLen: Integer; var Dest: PChar; DestLen: Integer): Boolean; stdcall;
Вызов HostApp "MyDecode" и передача в параметры Source, SourceLen и Dest, DLL возвращает декодированные Dest и DestLen,Проблема в том, что HostApp невозможно узнать декодированную длину Dest, и поэтому не будет знать, как предварительно выделить память Dest.
Я знаю, что можно разделить «MyDecode» на две функции:
function GetDecodeLen (Source: PChar; SourceLen: Integer): Integer; stdcall; // Return the Dest's length
function MyDecodeLen (Source: PChar; SourceLen: Integer; var Dest: PChar): Boolean; stdcall;
Но, мой процесс декодирования очень сложен, поэтому, если разделение на две функции повлияет на эффективность.
Есть ли лучшее решение?
Да, Александр, это может быть хорошим решением.Код HostApp:
//...
MyDecode(....)
try
// Use or copy Dest data
finally
FreeDecodeResult(...)
end;
Код DLL:
function MyDecode(...): Boolean;
begin
// time-consuming calculate
// Allocate memory
GetMem(Dest, Size);
// or New()?
// or HeapAlloc()?
end;
procedure FreeDecodeResult(Dest: PChar);
begin
FreeMem(Dest);
// or Dispose(Dest); ?
// or HeapFree(Dest); ?
end;
Возможно, мне следует изменить тип Dest на Pointer.
Какой метод выделения памяти лучше?GetMem / New или HeapAlloc?