2011-12-07 14 views
9

Wiem, że kiedy dzielę strings pomiędzy APP i Delphi Delphi DLL muszę dodać Sharemem zarówno aplikacji i dll źródła projektu jako pierwsza jednostka w uses klauzuli.Delphi Sharemem - Kiedy nie jest potrzebna

Ale jeśli funkcja eksportu dll akceptuje tylko Pchars, ale wewnątrz niektórych metod dll używam strings, czy powinienem również użyć sharemem? Pozwól mi pokazano przykładowy kod:

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

exports 
    ShowMyCustomMessage; 

w tym prosty i bezużytecznej przypadku dll jest przyjęcie Pchar ale wewnątrz eksportowanego metody DLL tworzy string var. Czy powinienem również dodać ShareMem?

Co z numerem WideString? Czy podanie parametrów WideString wymaga użycia Sharemem?

+2

AFAIK 'ShareMem' jest używany, jeśli chcesz użyć przestarzałego menedżera pamięci borlndmm.dll. Ale to nie jest dobry pomysł od Delphi 2007. Lepiej użyj SimpleShareMem, który opiera się na FastMM4 i jest * znacznie * szybszy. –

+0

@Arnaud jesteś pewien, że borlndmm jest przestarzałe? Nie widziałem, żeby ktoś o tym mówił. –

+0

@RafaelColucci: * stary * borlndmm.dll. Mylące, wszystkie biblioteki DLL menedżera pamięci mają tę nazwę. Obecna wersja Delphi/C++ Builder wykorzystuje FastMM, skompilowany do 'borlndmm.dll' i ma już od kilku lat. –

Odpowiedz

17

Musisz używać Sharemem wtedy i tylko wtedy, gdy pamięć jest przydzielona w jednym module (tj. DLL/EXE) i zwolniony w innym module. Zwykle dzieje się tak, gdy pracujesz, przechodząc między modułami.

W podanym przykładzie nie ma potrzeby używania Sharemem. Pamięć do PChar jest przydzielana przez wywoływaną i nie jest zwolniona przez wywoływacza. Łańcuch w adresie jest przydzielany i zwalniany w adresat.

Oto przykład, gdzie będzie trzeba Sharemem:

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

Tutaj pamięć dla łańcucha jest przydzielana w wywoływany ale będą zwalniane przez rozmówcę.

Sprawa z WideString jest dość wyjątkowa. Model WideString jest opakowaniem typu COM BSTR. Przydziela i zwolni przy użyciu współużytkowanego przydziału COM. Więc nie używa alokatora Delphi i możesz bezpiecznie przekazać WideString między modułami bez użycia Sharemem.

+0

miło wiedzieć, ale co, jeśli zamiast Pchar dll akceptuje najszerszy? –

+0

Odpowiedź zaktualizowana. Twoje pytanie nie wspominało o WideString! –

+0

Wiem, to był tylko plus. Dzięki za wszystko. –

Powiązane problemy