WEB开发网
开发学院软件开发VC 用ATL和MFC来创建ActiveX控件 阅读

用ATL和MFC来创建ActiveX控件

 2010-07-25 20:46:35 来源:WEB开发网   
核心提示:ATL的基本的COM支持ATL的目标是使开发者不必重写IUnknown, IDispatch, IclassFactory和其它的分支以将常规的DLL和EXE变成基于COM的DLL和EXE,从这个角度讲,用ATL和MFC来创建ActiveX控件(2),ATL是一个比MFC精简的多的框架,它设计和生成时就考虑了COM支持

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。

在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等宏用来使各种具体的类工厂支持有效。

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

图2显示了一个标准的基于ATL的控件。最值得注意的一点是MFC和ATL各是怎样引入实现一个控件所需的必要的各种接口的。MFC对标准控件接口的支持是内建在ColeControl类中的。你从ColeControl中派生出你的控件并且一次性继承所有的函数调用。注意ATL通过模板继承以零碎的方式逐个引入每个功能片断。这是一个非常重要的差异,因为这意味着用ATL你可以忽略一些接口实现模板(例如,使你的控件更为精简)剥掉不希望的功能。对MFC,你不能完成同样的动作——不管你想不想,你将获得所有接口。

关于例子应用

这里我将使用的例子是一个通过一个分支过程监控消息流的ActiveX控件,它实时的显示消息流图。这两个控件实际上有着相同的功能。它们都把图表提交到屏幕。它们都带流入接口以便包容器能通知控件开始和停止该图表。它们都支持图表线的颜色和消息间隔长度作为属性而可以永久存在。最后,它们都支持缺省事件集,将关于在一个特定时间段里处理的消息的数量通知包容器。图3显示了这两个控件。

Figure 3 监视 ActiveX 控件消息

上一页  1 2 3 4 5 6 7  下一页

Tags:ATL MFC 创建

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