初识统一事件模型之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连接点 - 最简单的例子 (1)

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

COM组件设计与应用(十六) 连接点(vc.net)

COM组件设计与应用(十六) 连接点(vc.net) 作者:杨老师 下载源代码 一、前言   上回书介绍了回调接口,在此基础上,我们理解连接点就容易多了。 二、原理 ...

COM组件设计与应用(十五) 连接点(vc6.0)

COM组件设计与应用(十五) 连接点(vc6.0) 作者:杨老师 下载源代码 一、前言   上回书介绍了回调接口,在此基础上,我们理解连接点就容易多了。 二、原理 ...
  • jiht594
  • jiht594
  • 2012年02月14日 15:42
  • 542

COM连接点测试代码.rar

  • 2013年04月06日 22:01
  • 155KB
  • 下载

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

From: http://blog.csdn.net/zj510/article/details/39056097   连接点,connection point,在COM里面也是挺重要的。简单...

COM 连接点简单例子

  • 2014年09月05日 13:53
  • 28KB
  • 下载

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

  • 2011年12月30日 11:19
  • 23KB
  • 下载

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

From: http://blog.csdn.net/zj510/article/details/39079221   这次我们来看一下连接点的基本工作原理。画了一个简单的图: 从上面的...

COM连接点 - Part V - CComDynamicUnkArray::Add问题

From : http://blog.csdn.net/zj510/article/details/39178003   无意中发现一个有趣的问题,连接点中用于保存接收器对象的容器CComDy...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:初识统一事件模型之COM连接点
举报原因:
原因补充:

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