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
并返回