加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 在HostApp和DLL之间预分配内存

发布时间:2020-12-15 04:22:03 所属栏目:大数据 来源:网络整理
导读:我有一个提供解码功能的DLL,如下所示: function MyDecode (Source: PChar; SourceLen: Integer; var Dest: PChar; DestLen: Integer): Boolean; stdcall; HostApp调用“MyDecode”,并转移到Source,SourceLen和Dest参数,DLL返回解码的Dest和DestLen. 问题是
我有一个提供解码功能的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中分配内存而不是要求调用者这样做.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读