2014-02-18 2 views
1

Delphi에서 유니 코드 PWideChar를 사용하여 DLL에서 C++ 함수를 호출하려면 어떻게해야합니까? Delphi에서 C++로 문자열을 보내고 수정하려고합니다.C++ DLL에서 유니 코드를 사용하는 방법

function Test(a: PWideChar): Integer; cdecl; external 'c:\Win32Project1.dll' name 'Test'; 

extern "C" __declspec(dllexport) int __cdecl Test(char* a) 
{ 
    a = "汉语"; 
    return 0; 
} 
+0

목표를보다 명확하게 정의해야합니다. DLL의 문자열을 호출자에게 다시 전달하고 싶습니까? 누가 문자열을 할당할까요? 아니면 리터럴을 반환 할 것입니까? 어떤 인코딩을 사용 하시겠습니까? 이 분야에서 약간의 경험이 부족한 것 같아서 BSTR 사용을 고려해 보시겠습니까? –

+0

@DavidHeffernan 예. C++에서 Delphi로 문자열을 반환 할 수 있지만 그 반대의 경우는 너무 어렵습니다. UTF16을 사용하고 싶습니다. – user3323367

+0

나는 그 의견을 정말로 이해하지 못한다. 네, 본질적으로 뭐라고 요? –

답변

3

일반적으로 호출자는 버퍼 길이와 함께 호출 수신자에게 전달되는 버퍼를 할당합니다. 그러면 호출 수신자가 버퍼를 채 웁니다. 얼마나 큰 버퍼를 찾아 당신이 고정 된 길이의 버퍼를 할당하지 않으려면,

function Test(buff: PWideChar; len: size_t): size_t; cdecl; external "mydll.dll"; 
.... 
var 
    buff: array [0..255] of WideChar; 
    s: string; 
.... 
Test(buff, Length(buff)); 
s := buff; 

당신은 함수를 호출 : 델파이 측면에서

size_t Test(wchar_t* buff, const size_t len) 
{ 
    const std::wstring str = ...; 
    if (buff != nullptr) 
     wcsncpy(buff, str.c_str(), len); 
    return str.size()+1; // the length required to copy the string 
} 

당신은 이런 식으로 부를 것이다 이 필요합니다 :

var 
    s: string; 
    len: size_t; 
.... 
len := Test(nil, 0); 
SetLength(s, len-1); 
Test(PWideChar(s), len); 

값을 함수에 전달하려면 다른 매개 변수를 사용하는 것이 좋습니다. 따라서 호출하기가 더 쉬워지고 입력 문자열에 출력 문자열을 허용 할만큼 큰 버퍼가 있는지 확인하도록 강요하지 않습니다. 어쩌면 이런 식으로 :

size_t Test(const wchar_t* input, wchar_t* output, const size_t outlen) 
{ 
    const std::wstring inputStr = input; 
    const std::wstring outputStr = foo(inputStr); 
    if (buff != nullptr) 
     wcsncpy(buff, outputStr.c_str(), len); 
    return outputStr.size()+1; // the length required to copy the string 
} 

다른면에서는;

function Test(input, output: PWideChar; outlen: size_t): size_t; cdecl; 
    external "mydll.dll"; 

그리고 호출 코드가 명확해야합니다.

+0

이것은 매우 도움이됩니다. 매우 감사. – user3323367

+0

루프에서 PWideChar 변환을 사용하면 성능이 저하됩니까? 예 :'PWideChar ('졸리 문자열')'; – user3323367

+1

컴파일러가이를 변환하므로 퍼펙트 영향은 없습니다. 퍼포 (Perf) 질문은 기초가 없어도 대답 할 수 없습니다. 분명히 인코딩에는 0 시간 이상 걸립니다. 그러나 귀하의 프로그램이 빠르거나 옳았 으면 좋겠습니까? –

관련 문제