【发布时间】:2011-09-15 07:27:14
【问题描述】:
我有一个调用 C++ DLL 的 C# 应用程序。
在 C# 中,我的代码如下:
[DllImport(@"111.dll", CharSet = CharSet.Unicode)]
public extern static String Func1(String arg);
......
String arg = "test text";
String retstring = Func1(arg);
在 CPP 中,我的函数定义如下:
extern "C"
{
__declspec(dllexport) LPWSTR Func1(LPWSTR arg)
{
....
LPWSTR ret1 = L"1?2?3?4?5";
LPWSTR ret2 = SomeActualFunction(arg);
retturn ret1; // return ret2;
}
}
如果我在 C++ 的 Func1() 中返回 ret1,一切正常。在 VS2008 的内存窗口中,我可以看到正确的 Unicode 二进制文件。在 C++ 中,ret1 的二进制文件是
“31 00 3f 00 32 00 3f 00 33 00 3f 00 34 00 3f 00 35 00”
,而在 C# 中,retstring 的二进制文件是
“28 67 a3 f7 fe 07 00 00 0a 00 00 00 09 00 00 00 31 00 3f 00 32 00 3f 00 33 00 3f 00 34 00 3f 00 35 00”
。我认为 C# 二进制文件
“28 67 a3 f7 fe 07 00 00 0a 00 00 00 09 00 00 00”
是 System.String 类型的标头。
更重要的是,如果我在 CPP 代码中的 return 之前添加以下行,我也可以在 C# 代码中获得正确的 retstring:
ret2 = L"1?2?3?4?5";
但是当我在 C++ DLL 中返回 ret2 时,C# 中返回的字符串 ret 似乎已损坏。根据我的检查,C++ DLL 中的二进制文件是正确的 Unicode。但是 C# 代码中 retstring 的二进制文件是
“28 67 a3 f7 fe 07 00 00 0a 00 00 00 09 00 00 00 dd dd dd dd dd dd dd dd dd dd dd ....”。
我只能注意到 ret2 比 ret1 长 - ret2 有数百个 WCHAR。
有什么想法吗?提前谢谢。
【问题讨论】:
-
这种编组在我看来不合适。由于您使用的是宽字符串,因此最好使用 BSTR 进行互操作。
-
c 尖字符串与 c 字符串不同,您需要查看它的转换。