德尔福的Sharemem - 不需要时

时间:2011-12-07 12:00:42

标签: delphi memory dll

我知道当我在Delphi APP和Delphi DLL之间共享strings时,我需要在app和dll项目源中添加Sharemem作为uses子句中的第一个单元。

但是,如果dll导出只接受Pchars的函数,但在我使用strings的某些dll方法中,我是否也应该使用sharemem?让我展示一个示例代码:

procedure ShowMyCustomMessage(aMessage : Pchar);
var
  vUselessString : string;
begin
  vUselessString := aMessage;
  ShowMessage(vUselessString);
end;

exports
  ShowMyCustomMessage;

在这个简单无用的情况下,dll接受Pchar,但在导出的方法中,dll会创建string var。我还应该添加ShareMem吗?

WideString怎么样?传递WideString参数是否需要使用Sharemem

1 个答案:

答案 0 :(得分:17)

当且仅当内存在一个模块(即DLL / EXE)中分配并在另一个模块中解除分配时,才需要使用Sharemem。当您在模块之间传递string时,通常会发生这种情况。

在您给出的示例中,不需要使用Sharemem。 PChar的内存由被调用者分配,并且不被被调用者释放。被调用者中的字符串在被调用者中被分配和释放。

以下是您需要Sharemem的示例:

function GetString: string;
begin
  Result := 'hello';
end;

此处字符串的内存在被调用者中分配,但将由调用者释放。

WideString的情况非常特殊。 WideString是COM BSTR类型的包装器。它使用共享的COM分配器分配和释放。所以它不使用Delphi分配器,你可以安全地在不使用Sharemem的模块之间传递WideString