在我的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字符被'?'替换.
只需将本机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
函数.