用ATL和MFC来创建ActiveX控件

http://tech.ddvip.com   2007年03月30日    社区交流

本文详细介绍用ATL和MFC来创建ActiveX控件

  ATL的原始COM支持是从对Iunknown的支持开始的。ATL的Iunknown实现分成两个部分:CcomObjectRootEx类,用来处理Iunknown部分的引用计数;CcomObjectRootBase类,用来处理QueryInterface。

  CcomObjectRootEx是一个基于模板的类,将线性模型作为其唯一参数。这是一个真正有趣的说明ATL怎样使用模板将算法作为模板参数传递的例子。ATL有两个处理引用计数的类,用于处理不同的线性模型: CComSingleThreadModel 和 CcomMultiThreadModel。这些类每个都有一个递增和一个递减函数。它们之间的区别是CcomSingleThreadModel用标准C++操作符(++和——)实现递增和递减;而CcomMultiThreadModel使用线程安全的InterlockedIncrement 和 InterlockedDecrement函数来实现这两个功能。根据用来实例化CcomObjectRootEx的模板参数,它能正确的运行给定的组件类型。你很快将会看到它的用法的一个例子。象MFC,ATL使用基于表的查找机制实现QueryInterface.。CComObjectRootBase 通过一个接口映射处理类的QueryInterface函数。BEGIN_ COM_MAP 和 END_COM_MAP 宏定义了一个接口映射的开始和结束。然而,不像MFC,ATL提供了17种途径来组成一个接口映射,例如使用从ATL的基于模板的接口实现类如IOleObjectImpl 来的vptrs。这包括了那些从tear-off 的类或者由聚合提供的类来的vptrs。

  在ATL里,C++类通过继承CcomObjectRootEx,指定它们想用的组件模型(记住,MFC的Iunknown支持是内建在CcmdTarget中的)变成了COM类。

  ATL的类对象(以及IClassFactory)支持也来自模板,而MFC的类对象支持通过ColeObjectFactory和一些宏而有效。ATL的类对象支持来自CComCoClass/CcomClassFactory类家族和CcomCreator类家族。CcomCoClass包含了类的GUID,定义了COM类的错误处理设施。CcomCreator类提供了CreateInstance的实现,供CcomClassFactory使用。对于MFC,你可以通过若干宏,使所有这种支持有效。ATL包括 DECLARE_CLASS_FACTORY, DECLARE_CLASS_ FACTORY2, DECLARE_CLASS_FACTORY_AUTO_THREAD, 以及 DECLARE_CLASS_FACTORY_SINGLETON等宏用来使各种具体的类工厂支持有效。

责编:豆豆技术应用

正在加载评论...