2011-01-31 152 views
0

我正在開發一個愛好項目,我需要從非託管C++調用託管代理。由於受到外部約束,我還需要在託運代碼中將代理從託管代碼傳遞到非託管代碼。使用COM互操作從非託管代碼調用託管代理

理想情況下,我想要做的就是像在C#中一樣調用委託(通過調用委託使用與方法調用相同的語法),但是來自非託管代碼。我無法弄清楚如何做到這一點,即使這是可能的。

這是可能做到的,如果是這樣,怎麼辦?我必須使用事件並從非託管代碼中引發事件嗎?

這就是我想要做的。

在管理方面(這是託管C++)

[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public delegate void CallbackMethod(); 

[ComVisibleAttribute (true)] 
[InterfaceTypeAttribute(ComInterfaceType::InterfaceIsIUnknown)] 
[GuidAttribute("CD305837-98FC-4433-A195-BD50C6C16369")] 
public interface class ICallback 
{ 
    void QueueCallback(CallbackMethod^ callBack); 
}; 

而且,從實現ICallback接口的非託管類:

HRESULT CIoComplectionPort::QueueCallback(_CallbackMethod * callBack) 
{ 
    // How is the callBack method invoked here? 
} 

回答

4

只需輸出一個接受函數指針的函數。 C#代碼可以調用它,傳遞一個委託對象。 pinvoke編組完成與Marshal.GetFunctionPointerForDelegate()相同的工作。它創建一個存儲委託的目標和方法的存根。你將得到的函數指針指向那個存根。

當C#代碼pinvokes,例如EnumWindows()發生完全相同的事情時。

0

您可以使用C++ \ CLI做到這一點,使用C++ \ CLI,您可以開發一個橋樑來溝通兩個世界,從本地C++調用調用委託的C++ \ CLI方法。