我在C ++ / CLI项目中有一些本机函数和一个将它们暴露给C#项目的ref(托管)类。
它公开的一个函数返回一个WCHAR*
字符串(AKA LPWSTR
/ wchar_t*
)。
当我运行打印它的C#程序时,我所能做的就是看是方形符号。
我在native return语句中设置了断点,调试器显示返回的字符串是正确的。
然后我走过一次并登陆托管函数(其中WCHAR*
变量设置为返回值),并以某种方式显示那些方形符号。
似乎一旦字符串进入托管“部分”就会搞砸了
我会显示我的代码,但问题发生在我将WCHAR*
字符串转换为System::String
之前,所以这并不重要。
请求的代码示例:
static String^ GetWindowTitle(IntPtr windowHandle)
{
HWND hWnd = (HWND)windowHandle.ToPointer();
LPWSTR nativeTitle = NativeGetWindowTitle(hWnd).get();
String^ title = gcnew String(nativeTitle);
return title;
}
答案 0 :(得分:3)
看看这一行:
LPWSTR nativeTitle = NativeGetWindowTitle(hWnd).get();
似乎很清楚nativeTitle
由NativeGetWindowTitle(hWnd)
返回的临时对象指向内存所有者。但是,当你通过nativeTitle
时,这种临时性已经消失了。
根据C ++标准:
临时对象被作为评估全表达式的最后一步而被销毁,该表达式(词法上)包含创建它们的点。
假设我们看不到的所有其他内容都正常工作,您可以通过确保NativeGetWindowTitle(hWnd)
返回的对象超出gcnew
语句来解决您的问题。