WEB开发网
开发学院软件开发VC 用ATL建立轻量级的COM对象(8) 阅读

用ATL建立轻量级的COM对象(8)

 2006-07-21 11:44:24 来源:WEB开发网   
核心提示:第一部分:为什么要使用ATL,第二部分:起步篇,用ATL建立轻量级的COM对象(8),第三部分:实现IUnknown,第四部分:实现接口,为了实现这种诀窍,ATL 类 IConnectionPointImpl 不从接口 IConnectionPoint 派生,第五部分:不要过分抽象,第六部分:输出你的类

第一部分:为什么要使用ATL。

第二部分:起步篇。

第三部分:实现IUnknown。

第四部分:实现接口。

第五部分:不要过分抽象。

第六部分:输出你的类。

第七部分:ATL和注册表。

连接

COM 编程最单调乏味的一个方面是使用连接点来支持 outbound 接口。IConnectionPoint/IConnectionPointContainer 的设计好像是专门用来解决这个问题的,但是经验证明,不论是在性能方面,还是在易用性方面,它还是存在不足之处。ATL为每一个这样的接口提供了缺省的实现类,多少解决了一些易用性问题。

要理解ATL如何实现连结点,最容易的方式是看例子:假设定义了如下的 outbound 接口:

interface IPageSink : IUnknown {
  HRESULT OnPageReceived(void);
}
interface IStopSink : IUnknown {
  HRESULT OnShutdown(void);
}

为了支持这两个 outbound 接口,下面的ATL代码已经足够:

class CPager
: public CComObjectRoot,
  public CComCoClass,
  public IPager,
  public IConnectionPointContainerImpl,
  public IConnectionPointImpl,
  public IConnectionPointImpl
{
BEGIN_COM_MAP(CPager)
  COM_INTERFACE_ENTRY(IPager)
  COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CPager)
  CONNECTION_POINT_ENTRY(IID_IPageSink)
  CONNECTION_POINT_ENTRY(IID_IStopSink)
END_CONNECTION_POINT_MAP()
};

大多数有经验的 COM 程序员首先注意到的是 CPager 类从一个接口(IConnectionPoint)派生的,这个接口并不作为 COM 本身的一部分提供。为了实现这种诀窍,ATL 类 IConnectionPointImpl 不从接口 IConnectionPoint 派生,而是象 IConnectionPoint 那样以相同的顺序定义它的虚函数。

1 2 3  下一页

Tags:ATL 建立 轻量级

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接