【问题标题】:How to pass a Object^ to a native function in C++ CLI如何在 C++ CLI 中将 Object^ 传递给本机函数
【发布时间】:2014-11-17 20:18:23
【问题描述】:

我是 C++ CLI 的新手,但我仍然没有得到新的指针和句柄。

我有一个打开窗口的本机函数。它需要一个父窗口的句柄:

void open(void* parentHwnd);

我应该如何将一个父窗口从托管代码传递给这个函数?我试图做这样的事情:

void managedOpen(Object^ parent)
{
   interior_ptr<void> ptr = &*parent);
   open(ptr);
}

但是 & 运算符“不能用于获取具有 ref 类类型的对象的地址”。

我是否也应该使用pin_ptr 而不是interior_ptr?

【问题讨论】:

    标签: c++-cli clr


    【解决方案1】:

    诸如 System::Object 之类的东西只能从托管传递到非托管,目的是将其传递回托管代码,例如调用 EnumWindows 的托管函数。但在这种情况下:

    • 在 C++/CLI 中,您可以简单地将指向包含 gcroot&lt;&gt; 的非托管对象的指针传递给您要访问的托管对象。
    • 在 C# 中,您可以使用 GCHandle 类来获取 IntPtr 并返回。

    【讨论】:

      【解决方案2】:

      在互操作场景中选择正确的类型是战斗的 99%。您没有从现有代码中获得任何帮助,void* 不是用于窗口句柄的合适类型。应该是HWND。那艘船可能很久以前就航行了。

      但是在从不类型列表中最重要的是System::Object。除非您与使用变体的 COM 代码进行互操作,否则这完全是偶然的。在托管代码中存储操作系统句柄的适当类型是IntPtr 或SafeHandle。窗口句柄严重偏向于 IntPtr,因为它们没有任何安全性,当用户关闭窗口时,它们将在您的控制之外消失。

      所以这需要看起来像这样:

      void managedOpen(IntPtr parent)
      {
         open(parent.ToPointer());
      }
      

      通过客户端代码的负担来产生一个有效的 IntPtr。可以是 Winforms 中的 Control.Handle 或 WPF 中的 WindowInteropHelper.Handle 等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多