2011-01-31 136 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方法。