2011-12-07 5 views
9

델파이 APP와 델파이 DLL간에 strings을 공유 할 때 uses 절의 첫 번째 단위로 app과 dll 프로젝트 소스에 모두 Sharemem을 추가해야한다는 것을 알고 있습니다.델파이의 Sharemem - 필요하지 않은 경우

그러나 Pchars 만 받아 들일 수있는 dll 함수의 경우, 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을 사용해야합니까?

+2

AFAIK 'ShareMem'은 사용되지 않는 borlndmm.dll 메모리 관리자를 사용하려는 경우에 사용됩니다. 하지만 Delphi 2007부터는 좋은 생각이 아닙니다. FastMM4 기반의 SimpleShareMem을 사용하는 것이 더 빠르고 * 빠릅니다. –

+0

@Arnaud borlndmm은 (는) 사용 중지 될 예정입니까? 나는 그것에 대해 말하는 사람을 보지 못했다. –

+0

@RafaelColucci : * old * borlndmm.dll. 혼란스럽게도 모든 메모리 관리자 DLL에는이 이름이 있습니다. 현재 버전의 Delphi/C++ Builder는 'borlndmm.dll'로 컴파일 된 FastMM을 사용하며 몇 년 전부터 사용되었습니다. –

답변

17

메모리가 하나의 모듈 (예 : DLL/EXE)에 할당되어 있고 다른 모듈에서 할당이 해제 된 경우에만 Sharemem을 사용해야합니다. 이것은 일반적으로 모듈간에 string을 전달할 때 발생합니다.

예제에서는 Sharemem을 사용할 필요가 없습니다. PChar의 메모리는 호출자에 의해 할당되고 호출 수신자에 의해 할당 해제되지 않습니다. 호출 수신자의 문자열은 호출 수신자에 할당되고 할당 해제됩니다. 여기

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

문자열에 대한 메모리가 호출자에 할당되지만 호출자가 해제됩니다

다음은 반드시 ShareMem을 필요 예입니다.

WideString의 사례는 매우 특별합니다. WideString은 COM BSTR 유형의 래퍼입니다. 공유 COM 할당자를 사용하여 할당 및 할당 해제합니다. 따라서 델파이 할당자를 사용하지 않으므로 Sharemem을 사용하지 않고 모듈간에 WideString을 전달하는 것이 안전합니다.

+0

알아두면 좋겠지 만 Pchar 대신 dll이 widestring을 허용한다면 어떨까요? –

+0

답변이 업데이트되었습니다. 귀하의 질문에 WideString 언급하지 않았다! –

+0

나도 알아, 그건 그냥 플러스 였어. 모든 것에 감사드립니다. –

관련 문제