在C ++中注册.NET COM事件的处理程序

时间:2010-01-22 08:26:12

标签: c# c++ com interop

我一直在关注如何通过COM(http://msdn.microsoft.com/en-us/library/zsfww439.aspxhttp://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的更多文档化方法。)

2 个答案:

答案 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调度表的声明。

你无法弄清楚如何实现这一点并不奇怪,你遗漏了一些重要的信息。