事件和通知

一、前言
  我的 COM 组件运行时产生一个窗口,当用户双击该窗口的时候,我需要通知调用者;
  我的 COM 组件用线程方式下载网络上的一个文件,当我完成任务后,需要通知调用者;
  我的 COM 组件完成一个钟表的功能,当预定时间到达的时候,我需要通知调用者;
  ... ... ... ...
  本回书开始话说 COM 的事件、通知、连接点......这些内容比较多,我分两次(共四回)来介绍。

二、通知的方法
  当程序甲方内部发生了某个事件的时候,需要通知乙方,无非使用几个方法:
 

通知方式简单说明评论
直接消息PostMessage()
PostThreadMessage()
向窗口或线程发个消息你什么时候执行我就不管啦
SendMessage()马上执行消息响应函数不执行完消息处理函数不会返回
SendMessage(WM_COPYDATA...)发消息的同时,还可以带过去一些自定义的数据比较常用,所以单独列了出来
间接消息InvalidateRect()
SetTimer()
......
被调用的函数会发送相关的一些消息这样的函数太多了
回调函数GetOpenFileName()......当用户改变文件选择的时候,执行回调函数嗨!哥们,这是我的电话,有事就言语一声。

  在 COM 的时代,以上这些方法就基本上不能玩转了,因为...您想呀 COM 组件是运行在分布式环境中的,地球另一边计算机上运行的组件,怎么可能给你的窗口发消息那?当然不能!(但话又说回来,对于 ActiveX 这样只能在本地运行的组件,当然也可以发送窗口消息的啦。)
  回调函数的方式,是设计 COM 通知方法的基础。回调函数,本质上是预先把某一函数的指针告诉我,当我有必要的时候,就直接呼叫该函数了,而这个回调函数做了什么,怎么做的,我是根本不关心的。好了,问你个问题:啥是 COM 的接口?接口其实就是一组相关函数的集合(这个定义不严谨,但你可以这么理解哈)。因此,在COM中不使用“回调函数”而是使用“回调接口”(说的再清楚一些,就是使用一大堆包装好的“回调函数”集) ,回调接口,我们也叫“接收器接口”。


图一、客户端传递接收器接口指针给COM。当发生事件时,COM调用接收器接口函数完成通知

本回示例程序完成的功能是:
  客户端启动组件(Simple11.IEvent1.1)并得到接口指针 IEvent1 *;
  调用接口方法 IEvent1::Advise() 把客户端内部的一个接收器(sink)接口指针(ICallBack *)传递到组件服务器中;
  调用 IEvent1::Add() 去计算两个整数的和;
  但是计算结果并不通过该函数返回,而是通过 ICallBack::Fire_Result() 返回给客户端;
  当客户端不再需要接受事件的时候,调用 IEvent1::Unadvise() 断开和组件的联系。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值