我是C ++ CLI的新手,我仍然没有得到新的指针和句柄。
我有一个打开窗口的本机函数。它需要父窗口的句柄:
void open(void* parentHwnd);
我应该如何将托管代码中的父窗口传递给此函数?我试图做这样的事情:
void managedOpen(Object^ parent)
{
interior_ptr<void> ptr = &*parent);
open(ptr);
}
但&amp; operator&#34;不能用于获取具有ref类类型的对象的地址&#34;。
我还应该使用pin_ptr
代替interior_ptr
吗?
答案 0 :(得分:6)
在互操作场景中挑选适当的类型是战斗的99%。您没有从现有代码获得任何帮助,void*
不适合用于窗口句柄。它应该是HWND
。那艘船很可能很久以前就航行了。
但是在从不类型列表的顶部是System :: Object。除非你使用变体的COM代码互操作,否则只能通过纯粹的意外正确地进行交互。在托管代码中存储操作系统句柄的适当类型是IntPtr
或SafeHandle
。由于没有任何关于它们的安全性,因此对于窗口句柄非常偏向于IntPtr,当用户关闭窗口时,它们将超出您的控制范围。
所以这需要看起来像这样:
void managedOpen(IntPtr parent)
{
open(parent.ToPointer());
}
负责客户端代码生成有效的IntPtr。可以是Winforms中的Control.Handle或WPF中的WindowInteropHelper.Handle等。
答案 1 :(得分:0)
System :: Object之类的东西只是从托管传递到非托管,目的是将其传递回托管代码,例如调用EnumWindows
的托管函数。但在这种情况下:
gcroot<>
的非托管对象的指针传递给您要访问的托管对象。GCHandle
类获取IntPtr
并返回。