2014-09-23 74 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並返回。
相關問題