2010-02-16 1 views
5

네이티브 Delphi 프로그램에서 Delphi Prism DLL로 문자열을 전달하려고합니다. 정수를 전달하는 데 문제가 없지만 문자열이 DLL에서 일치하지 않습니다. 다른 질문에 대한 답변으로 Robert Love's code snippet을 보았지만 기본 델파이 프로그램 용 코드는 없습니다.Prism DLL에 Delphi 문자열을 전달하려면 어떻게해야합니까?

어떻게 Delphi에서 Delphi Prism DLL로 문자열을 전달할 수 있습니까?

+3

이것은 커뮤니티이므로 질문에 한 명을 입력해서는 안됩니다. 당신이하고 싶다면 그의 대답에 대해 코멘트를 써라. 질문을 작성하는 경우 (이 경우 더 낫다), 가능한 한 일반으로 공식화하십시오. – jpfollenius

+0

동의. 로버트 Giesecke 내가 가질 수있는 것 보다이 대답했다. –

답변

1

Delphi Win32의 문자열은 .Net의 문자열과 다르게 관리되므로 .Net 문자열을 Delphi Win32로 전달하거나 그 반대로 할 수 없습니다.

문자열 값을 교환하려면 두 컴파일러에서 모두 지원되는 PChar 유형을 사용하는 것이 좋습니다. Windows API 함수에 문자열 값을 보내는 것과 같은 방법입니다.

감사합니다.

P. 나는 로버트가 아니다 ;-)

+0

죄송합니다. 위의 코드 스 니펫 작성자에게 보내는 메시지 여야합니다. 잘못된 버튼을 클릭했습니다. 하지만 어쨌든, PChar는 어떻게 작동합니까? Delphi 프리즘에는 PChar 유형이 없습니다. 만약 내가 네이티브 델파이와 프리즘의 문자열에서 pchar를 사용하면, 나는 첫 번째 문자를 올바르게 얻는다. 그러나 단 한 개의 문자. 해결 방법? –

+1

마커스. 걱정마. 아직 평판 포인트가 충분하지 않으므로 다른 사람의 질문에 추천을 게시 할 수 없었을 것입니다. 그것은 정당한 질문입니다. 스택 오버플로가 지원하지 않는 직접 메시지를 보내려고하는 것처럼 보이지 않도록 편집했습니다. –

+0

PChar는 단순히 첫 번째 문자를 가리키는 데 필요한 문자열을 보내고 두 번째는 문자열 데이터의 길이를 지정하여 다른 끝에서 시작점까지의 데이터를 읽을 수 있도록 문자에 대한 포인터입니다 캐릭터 라인의 길이 DLL 함수가 문자열 값을 반환하면 다른 쪽 끝에서 메모리 공간을 제공하고 시작 주소와 길이를 함수에 보내야 함수에서 출력 데이터를 해당 메모리 공간에 쓸 수 있습니다. – vcldeveloper

8

가장 좋은 방법은 WideString을 사용하는 것이다.

몇 가지 이유로.

  • 그것은 유니 코드와 D2009
  • 그것은 ole32.dll을에서 관리되는 메모리, 델파이의 메모리 관리자 또는 CLR GC 중 하나에 너무 종속되기 전에 작동합니다.
  • 직접 옥시 젼에서 포인터

처리하지 않아도, 그렇게처럼 쓸 수있다 :

type 
    Sample = static class 
    private 
    [UnmanagedExport] 
    method StringTest([MarshalAs(UnmanagedType.BStr)]input : String; 
         [MarshalAs(UnmanagedType.BStr)]out output : String); 
    end; 

implementation 

method Sample.StringTest(input : String; out output : String); 
begin 
    output := input + "ä ~ î 暗"; 
end; 

"MarshalAs는"앞뒤로 문자열을 마샬링하는 방법 CLR 알려줍니다. 이 문자열이 없으면 문자열은 Ansi (PAnsiChar)로 전달됩니다. 이는 아마도 이 아니며 일 것입니다.

이 델파이에서 그것을 사용하는 방법은 다음과 같습니다

또한
procedure StringTest(const input : WideString; out output : WideString); 
    stdcall; external 'OxygeneLib'; 

var 
    input, output : WideString; 
begin 
    input := 'A b c'; 
    StringTest(input, output); 
    Writeln(output); 
end. 

, 결코 이제까지 명확하게 외부 인터페이스에 대한 정의되지 않은 사용 유형. DLL 가져 오기 또는 내보내기에 PChar를 사용하면 안됩니다. 왜냐하면 D7 또는 D2009 (원래의 개발 시스템이 무엇인지에 따라 다름)를 컴파일 할 때 예외가 발생하기 때문입니다.