【问题标题】:Passing string from C++ to C++/CLI将字符串从 C++ 传递到 C++/CLI
【发布时间】: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


【解决方案1】:

看这一行:

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

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

根据 C++ 标准:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2015-12-23
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多