2014-09-23 78 views
0

我是C++ CLI的新手,我仍然没有获得新的指针和句柄。如何将对象^传递给C++ CLI中的本地函数

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

void open(void* parentHwnd); 

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

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

但&运营商“不能用于拍摄对象的地址与引用类类型”。

我也应该使用pin_ptr而不是interior_ptr

回答

6

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

但是在类型列表的列表之上从来没有使用的是System :: Object。只有通过绝对意外才能正确地进行互操作,除非您与使用变体的COM代码进行互操作。在托管代码中存储操作系统句柄的适当类型是IntPtrSafeHandle。由于没有任何关于窗口句柄的安全性,因此对窗口句柄严重偏向IntPtr,当用户关闭窗口时,它们将无法控制。

所以这需要看这样的:

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

随着对客户端代码的负担,产生有效的IntPtr。可以是WinForm中的Control.Handle或WPF中的WindowInteropHelper.Handle等。

0

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

  • 在C++/CLI中,你可以简单地将指针传递到包含gcroot<>您要访问管理对象的非托管对象。
  • 在C#中,您使用GCHandle类来获得IntPtr并返回。
相关问题