【发布时间】:2013-07-30 10:52:00
【问题描述】:
我的 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;
}
【问题讨论】:
-
请添加代码示例。
-
什么是
NativeGetWindowTitle?为什么在这里使用 C 字符串?当然你应该使用std:wstring?是什么让您相信当您将nativeTitle传递给String构造函数时它仍然有效?似乎很难想象会是这样。 -
NativeGetWindowTitle(hWnd).get() -> 你是在这里临时调用 get() 吗?
-
@DavidHeffernan 本机方法调用需要
LPWSTR参数的函数。我不知道为什么这很重要。它有效。 -
@stijn 是的。本机函数返回
unique_ptr<WCHAR[]>。
标签: c++ c++-cli interop marshalling