C++ cli 如何在C+中将对象^传递给本机函数+;CLI

C++ cli 如何在C+中将对象^传递给本机函数+;CLI,c++-cli,clr,C++ Cli,Clr,我有一个打开窗口的本机函数。它需要父窗口的句柄: void open(void* parentHwnd); 如何将父窗口从托管代码传递到此函数?我试着这样做: void managedOpen(Object^ parent) { interior_ptr<void> ptr = &*parent); open(ptr); } void managedOpen(IntPtr parent) { open(parent.ToPointer()); } vo

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

void open(void* parentHwnd);
如何将父窗口从托管代码传递到此函数?我试着这样做:

void managedOpen(Object^ parent)
{
   interior_ptr<void> ptr = &*parent);
   open(ptr);
}
void managedOpen(IntPtr parent)
{
   open(parent.ToPointer());
}
void managedOpen(对象^parent)
{
内部(ptr=&*父级);
开放式(ptr);
}
但是,&运算符“不能用于获取ref类类型的对象的地址”


我还应该使用
pin_ptr
而不是
interior_ptr

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

但在从不使用的类型列表的顶部是System::Object。除非您使用使用变体的COM代码进行互操作,否则这完全是偶然的。在托管代码中存储操作系统句柄的合适类型是
IntPtr
SafeHandle
。对窗口句柄的IntPtr有很大的偏见,因为它们没有任何安全性,所以当用户关闭窗口时,它们将超出您的控制

因此,这需要如下所示:

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

客户机代码产生有效IntPtr的负担。可以是Winforms或WindowInteropHelper中的Control.Handle。WPF中的Handle等。

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

  • 在C++/CLI中,只需将指向包含
    gcroot
    的非托管对象的指针传递给要访问的托管对象即可
  • 在C#中,使用
    GCHandle
    类获取
    IntPtr
    并返回