2011-12-07 62 views
9

我知道,当我在Delphi应用程序和Delphi DLL之间共享strings时,我需要在应用程序和dll项目源中添加Sharemem作为使用子句中的第一个单元。德尔福的Sharemem - 当不需要时

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

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

exports 
    ShowMyCustomMessage; 

在这简单的和无用的情况下,DLL是接受Pchar但是导出的方法内的dll创建string变种。我应该添加ShareMem吗?

WideString怎么办?请问WideString参数是否需要使用Sharemem

+2

如果您想使用已弃用的borlndmm.dll内存管理器,将使用AFAIK'ShareMem'。但是自Delphi 2007以来这不是一个好主意。你应该更好地使用基于FastMM4的SimpleShareMem,并且*更快*。 –

+0

@Arnaud你确定borlndmm被弃用吗?我还没有看到有人在谈论它。 –

+0

@RafaelColucci:* old * borlndmm.dll。令人困惑的是,所有内存管理器DLL都有这个名字。当前版本的Delphi/C++ Builder使用FastMM,编译为'borlndmm.dll',并且已经有好几年了。 –

回答

17

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

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

这里有一个例子,你将需要Sharemem:该字符串的记忆中被调用者分配,但会被调用者释放

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

这里。

WideString的情况很特殊。 WideString是围绕COM BSTR类型的封装。它使用共享的COM分配器分配和释放资源。所以它不使用Delphi分配器,您可以安全地在模块之间传递WideString而不使用Sharemem。

+0

很高兴知道,但如果不是Pchar而是dll接受宽字符串呢? –

+0

答复已更新。你的问题没有提到WideString! –

+0

我知道,那只是一个加分。谢谢你的一切。 –