您的位置:首页 > 其它

ATL和MFC,用哪种框架来创建ActiveX控件:第二部分

2011-10-18 16:52 316 查看
ATL基本的COM支持

ATL的目标是使开发者不必重写IUnknown, IDispatch, IClassFactory接口,并且在把常规的DLL和EXE变成基于COM的DLL和EXE时,也不必重写其分支部分。在这个方面,ATL是一个比MFC精简得多的框架,它设计和生成时就考虑了COM支持。它使用基于模板的方法,通过继承ATL提供的模板,开发者可以加入各种COM功能块。

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,或者由聚合提供的 vptrs。

在ATL里,C++类通过继承CComObjectRootEx,指定它们想用的公寓(apartment)模型(记住,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等宏用来使各种具体的类工厂支持有效。

最后,ATL 对IDispatch的支持也还是来自模板类,——其名字是IDispatchImpl.。比起MFC的IDispatch支持来,ATL对IDispatch的支持更是以COM为中心。MFC使用了一种hand-rolled 的IDispatch实现,而ATL使用更加标准的方法来加载一个接口的类型信息并代表标准的类型库编译器。

最值得注意的一点是MFC和ATL各自是怎样引入实现一个控件所需的必要的各种接口的。MFC对标准控件接口的支持是内建在COleControl类中的。你从COleControl中派生出你的控件并且一次性继承所有的函数调用。注意ATL通过模板继承以零碎的方式逐个引入每个功能片断。这是一个非常重要的差异,因为这意味着用ATL你可以忽略一些接口实现模板
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: