将字符串从C ++传递到C ++ / CLI

时间:2013-07-30 10:52:00

标签: c++ c++-cli interop marshalling

我在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;
}

1 个答案:

答案 0 :(得分:3)

看看这一行:

LPWSTR nativeTitle = NativeGetWindowTitle(hWnd).get();

似乎很清楚nativeTitleNativeGetWindowTitle(hWnd)返回的临时对象指向内存所有者。但是,当你通过nativeTitle时,这种临时性已经消失了。

根据C ++标准:

  

临时对象被作为评估全表达式的最后一步而被销毁,该表达式(词法上)包含创建它们的点。

假设我们看不到的所有其他内容都正常工作,您可以通过确保NativeGetWindowTitle(hWnd)返回的对象超出gcnew语句来解决您的问题。