如何在C ++ DLL中使用Delphi中的Unicode

时间:2014-02-18 22:44:57

标签: delphi delphi-xe5

如何在Delphi中使用Unicode PWideChar来调用DLL中的C ++函数?我想从Delphi发送一个字符串到C ++并修改它。

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

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

1 个答案:

答案 0 :(得分:3)

通常,调用者分配一个缓冲区,该缓冲区与缓冲区长度一起传递给被调用者。然后被调用者填充缓冲区。

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
}

在Delphi方面你会这样称呼它:

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;

如果您不想分配固定长度的缓冲区,则调用该函数以找出需要多大的缓冲区:

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";

调用代码应该很明显。