일반적으로 호출자는 버퍼 길이와 함께 호출 수신자에게 전달되는 버퍼를 할당합니다. 그러면 호출 수신자가 버퍼를 채 웁니다. 얼마나 큰 버퍼를 찾아 당신이 고정 된 길이의 버퍼를 할당하지 않으려면,
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";
그리고 호출 코드가 명확해야합니다.
목표를보다 명확하게 정의해야합니다. DLL의 문자열을 호출자에게 다시 전달하고 싶습니까? 누가 문자열을 할당할까요? 아니면 리터럴을 반환 할 것입니까? 어떤 인코딩을 사용 하시겠습니까? 이 분야에서 약간의 경험이 부족한 것 같아서 BSTR 사용을 고려해 보시겠습니까? –
@DavidHeffernan 예. C++에서 Delphi로 문자열을 반환 할 수 있지만 그 반대의 경우는 너무 어렵습니다. UTF16을 사용하고 싶습니다. – user3323367
나는 그 의견을 정말로 이해하지 못한다. 네, 본질적으로 뭐라고 요? –