在工作中需要在c++代码中回调c#写的一个函数,但这个函数返回的是字符串。以前的c++代码是使用MBMS编译的,没有发现什么问题。但现在c++代码升级后改为了unicode编译,结果问题出来了。
在c++代码中有LPCTSTR res = funcXXX();此时res中全是乱码,在内存中观察,发现返回的字符串是ANSI类型的,当作UNICODE使用时自然是乱码了。
在MSDN中阅读了关于互操作的文档,发现并没有针对c++回调C#的注意事项说明,于是网上GOOGLE,发现了蛛丝马迹。原来在这种情况下,并未指明如果使用返回的c# string。可能是在从.net返回到native时,自动的转换为ANSI类型。这是应该是指明返回类型为IntPtr。示例如下:
【C#函数】
public static IntPtr Report(IntPtr _x)
{
string x = Marshal.PtrToStringUni(_x);
string res = x + x;
return Marshal.StringToCoTaskMemUni(res);
}
【C++函数】
PINVOKETESTDLL_API int doCallback()
{
if (g_callback)
{
LPCTSTR info = g_callback(strInfo);
int l = 0; //在此断下后观察info。
}
return 0;
}
在阅读StringToCoTaskMemUni()文档后,觉得在c++代码中还是应通过CoTaskFree()来说释放得到的字符串。