Tôi có một DLL mà cung cấp một chức năng giải mã, như sau:Pre-cấp phát bộ nhớ giữa HostApp và DLL
function MyDecode (Source: PChar; SourceLen: Integer; var Dest: PChar; DestLen: Integer): Boolean; stdcall;
Các HostApp gọi là "MyDecode", và chuyển vào các thông số nguồn, SourceLen và đích, các DLL trả về giải mã Dest và DestLen. Vấn đề là: HostApp không thể biết được độ dài giải mã của Dest, và do đó sẽ không biết cách phân bổ trước bộ nhớ của Dest.
Tôi biết rằng có thể chia nhỏ "MyDecode" thành hai chức năng:
function GetDecodeLen (Source: PChar; SourceLen: Integer): Integer; stdcall; // Return the Dest's length
function MyDecodeLen (Source: PChar; SourceLen: Integer; var Dest: PChar): Boolean; stdcall;
Nhưng, quá trình giải mã của tôi là rất phức tạp, vì vậy nếu chia thành hai chức năng sẽ ảnh hưởng đến hiệu quả.
Có giải pháp nào tốt hơn không?
Có Alexander, đây có thể là giải pháp tốt. đang HostApp:
//...
MyDecode(....)
try
// Use or copy Dest data
finally
FreeDecodeResult(...)
end;
mã 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;
Có lẽ tôi nên thay đổi loại đích để con trỏ.
Phương pháp nhớ cấp phát nào tốt hơn? GetMem/Mới hoặc HeapAlloc?
Bạn đang cố giải quyết vấn đề nào: 1) cách tìm ra số tiền cần phân bổ trước; 2) làm thế nào để phối hợp quản lý bộ nhớ động giữa người gọi và callee? –
Để Marcelo: 1) Người gọi không thể tìm ra số tiền để phân bổ trước. 2) Có. – Leo
> Phương pháp bộ nhớ phân bổ tốt hơn là gì? Trong trường hợp của bạn, điều này không quan trọng. Sử dụng phương pháp mà bạn quen thuộc (tôi thích GetMem/FreeMem). – Alex