用ATL和MFC来创建ActiveX控件

2016-01-29 12:41 8 1 收藏

用ATL和MFC来创建ActiveX控件,用ATL和MFC来创建ActiveX控件

【 tulaoshi.com - C语言心得技巧 】

  如果你希望用C++来写ActiveX®控件,有两个流行的框架,一个是Microsoft® Foundation Classes (MFC),另一个是ATL。我将深入的解释这两种框架对开发ActiveX控件所提供的支持,帮助你更好的决定哪种模型最适合你的开发环境和需求。

  ActiveX控件的完全形态

  ActiveX控件基于构件对象模型COM,使得ActiveX控件成为可能的COM的基本原则是一个对象的接口和其实现能够而且应该分开对待。只要COM的对象和它的客户方代码就接口细节达成了一致,如何实现就不成其问题。ActiveX控件展示了大量ActiveX控件包容器理解的接口。因为客户方代码和控件认可这些接口的外在表现,你可以编写一个ActiveX控件然后简单的将它放入包容器中。包容器将通过良好定义的接口来驱动控件,而这些控件将以自己的方式做出合适的响应。在更高的层次上,一个ActiveX控件是实现了几个主要ActiveX技术的一个COM对象,包括通常的引入COM接口,OLE嵌入协议,连接点和属性页。在较低的编程层次上,ActiveX控件只是实现了某些类型接口的COM类。当一些客户方代码成功的查询到这些接口之一时,它就知道如何使用一个ActiveX控件了。

  一个ActiveX控件暴露的接口主要分为3类。第一,ActiveX控件是可嵌入的对象;就是说,它们实现了大多数的OLE文档、in-place激活和嵌入协议。ActiveX控件实现了如下的接口:

  IOleObject, IPersistStorage, IDataObject, IOleInPlaceActiveObject, IOleInPlaceObject, IViewObject2和IRunnableObject (这一个很少用到). 第二ActiveX控件通常都支持属性页,这样客户方就可以修改控件的属性了。最后,ActiveX控件通常都利用COM的连接点技术,实现了客户方能发现的外出接口。

  为了帮助比较ATL和MFC框架,我们来看一下写在每一种框架中的相同的控件。此控件监视创建它的线程上传递的消息流。消息流控件是一个很不错的例子,因为它演示了一个ActiveX控件所有主要的方面,包括送入接口、外出接口,属性,永久性以及属性页。让我们从研究这两个框架提供的标准的COM支持开始吧。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

  MFC的基本COM支持

  Microsoft建立MFC使得开发Windows®应用程序比使用SDK容易多了。有了MFC,Microsoft接着增加了对即存框架的COM支持。这意味着MFC的开发者在增加越来越多的函数时必须保持框架的完整。同时,Visual C++®编译器那时还不支持模板,因此,它们不得不借助非模板的其它手段来将COM功能掺入它们的类中。Microsoft通过加入一些虚函数到CcmdTarget类和一些宏中解决了这个问题,使得在MFC中实现COM接口有了可能。

  MFC内部的COM支持从CcmdTarget开始,CcmdTarget类实现了Iunknown接口,还包括了一个用于引用计数的成员变量(m_dwRef)以及用于实现IUnknown 的6个函数:: InternalAddRef, InternalRelease, InternalQueryInterface, ExternalAddRef, ExternalRelease, 和 ExternalQueryInterface.。QueryInterface的两个版本——AddRef和Release支持COM聚合。InternalAddRef, InternalRelease和InternalQueryInterface完成引用计数和QueryInterface操作,而ExternalAddRef, ExternalRelease和 ExternalQueryInterface代理控制聚合的对象(如果此对象参与聚合的话)。

  MFC使用嵌套的类复合策略来实现COM接口。在MFC中,想实现COM 接口的类是从CcmdTarget中派生的。每个由CcmdTarget派生出的类实现的接口得到它自己的嵌套类。MFC使用宏BEGIN_INTERFACE_PART和END_INTERFACE_PART来产生嵌套类。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

  最后,MFC实现了表驱动的QueryInterface。MFC的接口映射的工作机理同它的消息映射基本相同:MFC的消息映射把一个Windows消息和一个C++类中的函数相联系;MFC的接口映射把一个接口的GUID和一个表示此接口的特定的vptr的地址相联系。每个基于CcmdTarget的类实现COM接口通过更多的宏:DECLARE_INTERFACE_MAP, BEGIN_INTERFACE_MAP, INTERFACE_PART,和 END_INTERFACE_MAP来增加一个接口映射。

  为了理解这些宏在实际中是什么样子的,请看图1,它说明了实现ActiveX控件,COleControl 的MFC类。当你细读代码时,注意ColeControl带有夹在一对BEGIN_INTERFACE_PART 和 END_INTERFACE_PART宏之间的每个接口的签名,还要注意ColeControl的接口映射表有22个条目。

  除了实现了Iunknown接口,MFC还包括IclassFactory的一个标准实现。再一次,MFC通过若干宏提供了此支持。MFC有两个宏来提供类对象:DECLARE_OLECREATE_EX 和 IMPLEMENT_OLECREATE_EX.。在一个基于CcmdTarget的类中使用这些宏增加一个ColeObjectFactory类型的静态成员到该类中。如果你看一下AFXDISP.H中

来源:https://www.tulaoshi.com/n/20160129/1487203.html

延伸阅读
一、引入Dialog技术 下面介绍在制作ActiveX控件时引入有模式对话框技术,制作步骤如下: 创建一新的MFC ActiveX ControlWizard项目,取名为Hello,其他用缺省选项; 在ResourceView页中新增一对话框资源,命名为IDD_HELLODIALOG,可以在对话框上放自己的控件; 为对话框资源IDD_HELLODIALOG创建新...
熟悉VB的朋友对使用ActiveX控件一定不会陌生,众多控件极大地方便了编程,但唯一的缺陷是不能动态加载控件,必须在设计时通过引用,将控件放置在窗体上。VB6.0已能够解决该问题,只是帮助中没有明确说明,并且没有描述到一些关键功能,由于以前的版本中可以动态创建进程外服务:如果对象是外部可创建的,可在 Set 语句中用 New 关键字、Cre...
标签: Web开发
最近在用ajax开发服务器程序,发现IE浏览器不支持xmlhttprequest对象,而且找不到Microsoft.XMLHTTP控件。 问题出现了我们需要解决,解决方案如下: 1、运行下regsvr32 msxml3.dll; 2、用现成的框架来做ajax; 3、代码优化: if(window.ActiveXObject)     {     &nbs...
在MFC中应用CTreeCtrl控件的技巧 作者:阿宽 下载源代码 首先,我们要创建一个基本对话框的MFC工程MFC_TreeCRTL(名字随便给一个)。然后在资源视图中插入两个Dialog,ID分别为IDD_DIALOG11和IDD_DIALOG211,都更改Style属性为Child,Border属性为None,为它们建立两个类,分别命名为Cdialog11和C...
INTRODUCTION 本文描述如何注册或注销 Microsoft Office Access 2007 中 ActiveX 控件。 更多信息 在早期版本的 Access 比 Access 2007, 您可以注册或撤消 ActiveX 控件通过单击 工具 菜单上 ActiveX 控件 。 Access 2007, 中无法使用此方法。 如果要注册或撤消 ActiveX 控件, 使用下列方法之一。 方法 1: 使用 VisualBa...

经验教程

792

收藏

55
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部