在之前我们的COM对象都是单向的,只能由我们调用COM组件指定接口的方法。现在,如果我们想在COM组件状态改变时获得通知,该怎么办呢?这实际上就是个回调设计,或者说是设计模式中的观察者模式。COM中会主动通知客户当前状态改变的叫做可连接对象,又叫源对象。
1.基本原理
还是借用潘大大的图,如下
当我们获得可连接对象的接口后,可以讲当前客户的接口注册到可连接对象中,当可连接对象状态发生变化时调用客户端实现的接口即完成了通知过程。每个客户可连接多个源对象,每个源对象可同时被多个各户连接。
这里显然客户端和可连接对象是有一个协商的过程的,确定好双方的调用协议,整个工作过程才正常。
2.具体实现过程
COM标准规定源对象需要实现IConnnectionPointContainer接口,该接口定义如下:
EnumConnnectionPoint获得一个迭代器,用于遍历当前连接点容器中可用的连接点。
FindConnectionPoint根据指定的IID获得对应的连接点。
每个可连接点需实现IConnectionPoint接口,定义如下:
Advise和Unadvise分别是连接和断开连接,就是注册客户接口的接口。
GetConnectionInterface获得当前连接点的IID。
GetConnectionPointContainer获得当期接口的容器。
EnumConnections获得一个迭代器,遍历得到当前连接到当前连接点的客户接口。
整个关系可如下图所示。
那么总结可知,为了实现一个可连接对象,需要:
1.源对象实现IConnnectionPointContainer和IConnectionPoint接口
2.客户端需要实现一个接收器接口,使用时将该接收器连接(注册)到源对象上
3.客户端的接口需要和源对象协商,理论上只要二者商量好即可,但实际中常用的是自动化接口——IDispatch,具体原因请参看《COM原理与应用》
原创,转载请注明来自http://blog.csdn.net/wenzhou1219