初识统一事件模型之COM连接点

原创 2006年06月06日 00:21:00
学习C#的时候,最喜欢的就是event关键字,因为事件处理变得很轻松。以往在C++里,我们一般是使用回调函数或者虚函数(接口),虽然也挺方便,但是如果有多个事件接收者就比较麻烦了,而且每个人实现的回调方式都不一样。在COM编程模型里的连接点也很好,允许多个事件接收者,甚至利用COM的机制跨进程回调通知,可惜实现太负责,调用也麻烦。最好还是像C#的event关键字,清晰明了。

在尝试使用Attribute编写COM组件的时候,发现原来微软在VC++里增加很多关键字,用以简化和统一事件模型。这样使用同样的语法,就可以同时处理Native,COM和Managed的事件!

为了利用VC++的这个新特性(好像2000年就出来了,不算新啦,见笑见笑),今天郁闷了一天,现在终于搞定了,总结一下。

事件的定义和触发

__interface _IMyEventSink
{
    HRESULT SomethingHappened();
};

[coclass,event_source(com)]    //关键是event_source(com)
class MySourceObject
{
  __event __interface _IMyEventSink;    //跟C#的语法一样

  void DoSomething()
  {
     __raise SomethingHappened();    //直接调用事件接口里的方法。
  }
};

事件的接收,有两种办法,你可以单独接收某个事件(接口里的一个方法),或者接收事件接口里的所有方法。前者比较灵活,后者比较省事。

#import "mycom.dll"  no_namespace embedded_idl

//如果用#import引入类型库,一定要记得带上embedded_idl参数。为了这个,我可郁闷了很久啊。
//但是这个参数加上后,带来一个副作用,那就是那些封装函数没有了,比如属性的访问函数put_name不能直接用name访问了。

IUnknown* pSourceObject;

...

//下面只处理一个事件
[event_receiver(com)]
class _MyEventHandler
{
public:
    void Advise(IUnknown* pSource)
    {
         __hook(&_IMyEventSink::SomethingHappened,pSource,&_MyEventHandler::SomethingHappenedXXX);
    }

       HRESULT SomethingHappenedXXX()    //函数名不需要跟事件方法相同
       {
          //...
       }
};

_MyEventHandler handler;
handler.Advise(pSourceObject);


//下面处理所有事件
[module(name="mymodule")];    //必须

[coclass,uuid("..."),event_receiver(com,true)]    //必须是一个COM对象
class _MyEventHandler :public  _IMyEventSink    //必须从_IMyEventSink派生
{
public:
    void Advise(IUnknown* pSource)
    {
        __hook(_IMyEventSink,pSource);
    }

       HRESULT SomethingHappened()    //原型必须与_IMyEventSink里的方法一致
       {
          //...
       }
};

CComObject<_MyEventHandler>* pHandler=new CComObject<_MyEventHandler>;
pHandler->AddRef();
pHandler->Advise(pSourceObject);


如此看来,COM的连接点还是比较容易实现的。

参考文档:
http://msdn.microsoft.com/msdnmag/issues/01/04/Attributes/default.aspx

COM连接点 - Part II - 最简单的例子 (1)

From: http://blog.csdn.net/zj510/article/details/39056097   连接点,connection point,在COM里面也是挺重要的。简单...
  • marryshi
  • marryshi
  • 2014年11月07日 12:09
  • 1002

COM连接点 - 基本原理(2)

这次我们来看一下连接点的基本工作y
  • zj510
  • zj510
  • 2014年09月05日 13:53
  • 2057

COM 连接点事件讲解

开发环境:VC++6.0测试环境:windows 2000 这篇文章是Alex C. Punnen.所写,在http://www.codeguru.com/上发表的,在此本人将其翻译成中文,和大家共享...
  • wovow
  • wovow
  • 2004年12月12日 21:49
  • 2114

COM连接点 - 最简单的例子 (1)

先创建一个COM接口,IMyCar
  • zj510
  • zj510
  • 2014年09月04日 22:11
  • 5427

COM连接点事件event

COM 中的典型方案是让客户端对象实例化服务器对象,然后调用这些对象。然而,没有一种特殊机制的话,这些服务器对象将很难转向并回调到客户端对象。COM 连接点便提供了这种特殊机制,实现了服务器和客户端之...
  • vlily
  • vlily
  • 2017年04月21日 15:34
  • 467

COM连接点 - 一个COM接口实现多个连接点(3)

之前讲到一个COM接口可以实现多个连接点。我们就来写个例子。 其实,我还真不知道怎么用ATL...
  • zj510
  • zj510
  • 2014年09月05日 14:26
  • 1455

COM连接点 - Part I - 基本原理

From: http://blog.csdn.net/zj510/article/details/39079221   这次我们来看一下连接点的基本工作原理。画了一个简单的图: 从上面的...
  • marryshi
  • marryshi
  • 2014年11月07日 12:08
  • 1337

18.可连接对象和连接点原理

讲解可连接对象和连接点原理,说明实现一个可连接对象需要做的事情。
  • wenzhou1219
  • wenzhou1219
  • 2016年07月16日 21:04
  • 767

体会COM连接点与实现接收器!

1.COM为了达到通信的双向性(可连接COM对象),即客户端可以调用服务器的功能,在必要的时候服务器也可以调用客户端的接收器功能。2.如果COM要支持事件出口,是可连接的,那么必须实现IConnect...
  • jasonm2008
  • jasonm2008
  • 2009年09月29日 14:53
  • 2007

ATL7.1创建连接点组件

 目录:ATL7.1创建连接点组件... 1目录:... 1一基础理论:... 11) 源对象和接收器对象... 12) 建立/断开连接... 13)连接点... 24) 同时支持多个连接点... 2...
  • sheismylife
  • sheismylife
  • 2006年09月01日 16:44
  • 5995
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:初识统一事件模型之COM连接点
举报原因:
原因补充:

(最多只允许输入30个字)