1

我的 C++/CLI 项目中有一些本机函数和一个将它们公开给 C# 项目的 ref(托管)类。

它公开的函数之一返回一个WCHAR*字符串 (AKA LPWSTR/ wchar_t*)。
当我运行打印它的 C# 程序时,我只能看到方形符号。

我在本机返回语句处设置了一个断点,调试器显示返回的字符串是正确的。然后我跨过一次并进入托管函数(它有一个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;
}
4

1 回答 1

3

看这一行:

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

nativeTitle由 .返回的临时对象指向内存所有者似乎很清楚NativeGetWindowTitle(hWnd)。但是当你过去的时候,那个暂时的已经过去了nativeTitle

根据 C++ 标准:

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

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

于 2013-07-30T11:13:09.010 回答