2011-12-07 103 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

我知道,那只是一個加分。謝謝你的一切。 –