将unicode字符串从C#exe传递给C++ DLL

War*_*pin 3 c# c++ unicode

在我的C#exe中使用此函数,我尝试将Unicode字符串传递给我的C++ DLL:

    [DllImport("Test.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
    public static extern int xSetTestString(StringBuilder xmlSettings);
Run Code Online (Sandbox Code Playgroud)

这是C++ DLL端的功能:

__declspec(dllexport)int xSetTestString(char*pSettingsXML);

在C#中调用函数之前,我执行MessageBox.Show(string)并正确显示所有字符.在C++方面,我这样做:OutputDebugStringW((wchar_t*)pString);,但是这表明非ASCII字符被'?'替换.

Aoi*_*asu 5

只需将本机DLL中的导出更改为:

extern "C" __declspec(dllexport) int xSetTestString(wchar_t* pSettingsXML);
Run Code Online (Sandbox Code Playgroud)

这样就可以了.

顺便说一句 - 你不能简单地做,char* str1 = (wchar_t*)pSettingsXML;因为它不转换字符串.您需要使用wcstombs_s转换wchar_t*char*.但在你的情况下,你不必这样做.

注意:最佳实践IMO是使用TCHAR*而不是wchar_t*直接使用,并将您的本机DLL项目常规选项字符集设置使用Unicode字符集.这定义TCHAR*wchar_t*.

Mirosoft本身使用两组函数:ANSI,使用1字节字符,标记为FunctionNameA和Unicode,使用2字节字符,标记为FunctionNameW.这个Unicode实际上是UTF-16.

UTF-8是一个多字节字符串,对于标准字符使用1字节,对于非标准字符使用2字节.要将UTF-8转换为UTF-16,您可以使用MultiByteToWideChar函数.