我有一个提供解码功能的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?
解决方法
您可以通过其他方式将“MyDecode”拆分为两个例程:
function MyDecode(Source: PChar; SourceLen: Integer; out Dest: PChar; out DestSize: Integer): Boolean; stdcall; procedure FreeDecodeResult(Dest: PChar); stdcall;
即 – 你在MyDecode中分配内存而不是要求调用者这样做.