我知道当我在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
?
答案 0 :(得分:17)
当且仅当内存在一个模块(即DLL / EXE)中分配并在另一个模块中解除分配时,才需要使用Sharemem。当您在模块之间传递string
时,通常会发生这种情况。
在您给出的示例中,不需要使用Sharemem。 PChar
的内存由被调用者分配,并且不被被调用者释放。被调用者中的字符串在被调用者中被分配和释放。
以下是您需要Sharemem的示例:
function GetString: string;
begin
Result := 'hello';
end;
此处字符串的内存在被调用者中分配,但将由调用者释放。
WideString
的情况非常特殊。 WideString
是COM BSTR
类型的包装器。它使用共享的COM分配器分配和释放。所以它不使用Delphi分配器,你可以安全地在不使用Sharemem的模块之间传递WideString
。