我一直在关注如何通过COM(http://msdn.microsoft.com/en-us/library/zsfww439.aspx和http://msdn.microsoft.com/en-us/library/bd9cdfyx.aspx)公开.NET框架的'教程'。除了活动部分,一切都有效。当我向C#接口添加事件时,会生成以下C ++代码:
struct __declspec(uuid("..."))
_MessageEventHandler : IDispatch
{};
struct __declspec(uuid("..."))
IConnection : IDispatch
{
virtual HRESULT __stdcall add_MessageEvent (
/*[in]*/ struct _MessageEventHandler * value ) = 0;
virtual HRESULT __stdcall remove_MessageEvent (
/*[in]*/ struct _MessageEventHandler * value ) = 0;
}
问题是我还没有找到有关如何在C ++中使用它的任何信息。我是否需要从_MessageEventHandler
派生并实施operator()
?或完全不同的东西?
(请注意,目前我还在尝试使用IConnectionPointContainer和IConnectionPoint的更多文档化方法。)
答案 0 :(得分:2)
我使用COM已经很长时间了,当时我使用的是Visual C ++ 6.0。我记得为COM连接点实现接收器并不是一个简单的过程。有多种方法可以实现它们,具体取决于您是否使用过MFC或ATL。也许现在有更简单的方法。以下是一些可以帮助您的链接:
Code Project - Sinking events from managed code in unmanaged C++
Code Project - COM - 关于COM的大量文章
Code Project - Handling COM Events in a Console Application
Code Project - Handling COM Events in a Console Application, Part II
答案 1 :(得分:1)
IDispatch用于VB之类的运行时绑定语言,对于像c#这样的强类型语言,通常不需要这样做。
当您通过IDispatch调用方法时,您实际做的是构建一个包含方法id(称为dispid)和参数的数组,然后将其交给一个函数,该函数通过dispid搜索方法表,当它找到时一,它使用你的参数数组来构建一个callstack,然后调用该方法。 (当然,这是过于简单化了。)
因此,知道一个类实现IDispatch几乎没有任何东西。
因此,这是以太虚假的导致,或者您缺少MessageEventHandler调度表的声明。
你无法弄清楚如何实现这一点并不奇怪,你遗漏了一些重要的信息。