COM(6)

对于一个全面的交互过程来说,这样的单向通信往往不能满足实际的需要,组件对象也要主动与客户进行通信,因此,与入接口相对应,对象也可以提供出接口,对象通过这些出接口与客户进行通信。
如果一个COM对象支持一个或多个出接口,则我们称这样的对象为可连接对象(connectable object),有时也称为源对象(source)。


可连接对象的出接口也是COM接口,它包含一组成员函数,每个成员函数代表了一个事件(event)、一个通知(notification)或者一个请求(request)。事件和通知在概念上完全一致。
之所以把这些接口称为出接口,其原因在于这些接口并不由对象实现,而是由客户程序来实现,客户实现这些接口,并把接口指针告诉对象,以后对象利用此接口指针与客户进行通信。在客户程序方,实现这些接口的对象被称为接收器(sink),接收器本身也是一个COM对象,但它往往比较简单,只用于监听并处理组件对象的通知或请求。


虽然接收器也是一个COM对象,但由于接收器的特殊性,它位于客户程序内部,并不需要通过COM库来创建,所以接收器并不需要CLSID来标识,也不需要类厂,接收器的标识和创建过程完全是客户程序内部的事情。


可连接对象可以支持一个或多个出接口,它通过接口IConnectionPointContainer管理所有的出接口。对应于每一个出接口,可连接对象又管理了一个称为连接点(connection point)的对象,每一个连接点对象实现了IConnectionPoint接口,客户通过连接点对象建立连接器与可连接对象的连接。


一个可连接对象可以支持多个出接口,在接口IConnectionPointContainer的成员函数中使用一个枚举器暴露出此对象所支持的所有出接口;对于每一个出接口的连接点对象,在接口IConnectionPoint中也用一个枚举器管理它所连接的接收器。通过这两个枚举器的收入,使得可连接对象支持多个出接口,每个出接口支持与多个接收器连接。


根据QueryInterface查询IConnectionPointContainer接口是否成功来判断组件对象是否是可连接对象。


在COM规范中,枚举器只是一个概念,没有确定的接口用于规定枚举器的各项操作,一般有这些功能:Next, Skip, Reset, Clone。


class IConnectionPointContainer: public IUnknown
{
virtual HRESULT EnumConnectionPoints(IEnumConnectionPoints **) = 0; //用于返回连接点枚举器
virtual HRESULT FindConnectionPoint(const IID *, IConnectionPoint **) = 0; //用于查找指定IID的连接点
}


class IConnectionPoint: public IUnknown
{
virtual HRESULT GetConnectionInterface(IID * pIID) = 0;
virtual HRESULT GetConnectionPointContainer(IConnectionPointContainer ** ppCPC) = 0;
virtual HRESULT Advise(IUnknown *pUnk, DWORD *pdwCookie) = 0;
virtual HRESULT Unadvise(DWORD dwCookie) = 0;
virtual HRESULT EnumConnections(IEnumConnections ** ppEnum) = 0;
}











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值