1.ActiveX的基本概念html
ActiveX控件能够看做是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一块儿运行。这个容器包括WEB网页,应用程序窗体等。。。c++
ActiveX控件的后缀名是OCX或者DLL。通常是以OCX和动态库共存的形式打包成cab或者exe的文件放在服务器上,客户端下载后运行安装cab或exe解压成OCX和动态库共存的文件,而后注册ocx文件。程序员
ActiveX控件是基于com标准,使得软件部件在网络环境中进行交互的技术集。它与具体的编程语言无关。做为针对Internet应用开发的技术,ActiveX被普遍应用于WEB服务器以及客户端的各个方面。同时,ActiveX技术也被用于方便地建立普通的桌面应用程序,此外ActiveX通常具备界面。编程
2.三个概念:ActiveX、OLE和COMwindows
从时间的角度讲,OLE是最先出现的,而后是COM和 ActiveX;从体系结构角度讲,OLE和ActiveX是创建在COM之上的,因此COM是基础;单从名称角度讲,OLE、ActiveX是两个商标名称,而COM则是一个纯技术名词,这也是你们更多的据说ActiveX和OLE的缘由。COM是应OLE的需求而诞生的,因此虽然COM是OLE的基础,但OLE的产生却在COM以前。COM的基本出发点是,让某个软件经过一个通用的机构为另外一个软件提供服务。ActiveX最核心的技术仍是COM。ActiveX和OLE的最大不一样在于,OLE针对的是桌面上应用软件和文件之间的集成,而 ActiveX则以提供进一步的网络应用与用户交互为主。COM对象能够用C++、Java和VB等任意一种语言编写,并能够用DLL或做为不一样过程工做的执行文件的形式来实现。使用COM对象的浏览器,无需关心对象是用什么语言写的,也无须关心它是以DLL仍是以另外的过程来执行的。从浏览器端看,无任何区别。这样一个通用的处理技巧很是有用。浏览器
3.ActiveX控件工程的建立服务器
使用VS2010有两种方式能够建立ActiveX工程,网络
第一种:建立“MFC ActiveX 控件”工程;编程语言
第二种:建立“ATL 项目”。因为使用ATL开发ActiveX控件须要了解com技术,对程序员的要求也较高,开发时间也较长,因此若是ActiveX只在windows操做系统下运行,那么就使用“MFC ActiveX 控件”工程来快速创建ActiveX控件。可是这里要注意了:使用“MFC ActiveX 控件”工程来快速创建ActiveX控件,他不只要创建在windows操做系统下,还必须在windows操做系统下安装c++依赖库安装包,由于MFC是创建在微软的c++动态库的基础上的。因此这两种方式各有优缺点,根据项目需求来选择适合的方式。编辑器
4.使用VS2010建立MFC ActiveX工程项目步骤
因为使用ATL进行ActiveX工程的建立难度比较大,因此这里先使用“MFC ActiveX 控件”工程来建立一个简单的ActiveX控件。
第一:新建项目-》选择“MFC ActiveX 控件”工程,给项目命名TestMfcAtlDebug,点击肯定,弹出“控件向导”对话框
第二:在概述,应用程序设置,控件名称和控件设置均可以选择默认,而后点击“完成”,这样“MFC ActiveX 控件”工程建立完成
5.分析“MFC ActiveX 控件”工程的三个重要的类以及对外接口定义文件idl
使用向导建立完工程能够看到自动生成了三个类,TestMfcAtlDebug,TestMfcAtlDebugCtrl和TestMfcAtlDebugPropPage
能够打开上面三个类的头文件及cpp文件,发现它们都是派生类。
TestMfcAtlDebug:cpp文件中定义了DllRegisterServer和DllUnregisterServer,能够发现ActiveX的注册和反组册都与该类有关。
TestMfcAtlDebugCtrl:能够发现该头文件中声明了消息映射(让ActiveX控件程序能够接受系统发送的事件通知,如窗体建立和关闭事件),调度映射(让外部调用程序(包含ActiveX的容器)能够方便地访问ActiveX控件的属性和方法),事件映射(让ActiveX控件能够向外部调用程序(包含ActiveX的容器)发送事件通知)。也就是说对ActiveX控件的窗口操做都将在这个类中完成,包括ActiveX控件的建立,重绘,以及在此类中建立可视MFC窗体。
TestMfcAtlDebugPropPage:显示ActiveX控件的属性页的
让咱们来看看最重要的部分:对外接口定义文件TestMfcAtlDebug.idl,代码以下:
#include <olectl.h> #include <idispids.h> [ uuid(69EE37F4-8B36-495F-9F60-5E3AAF2FB494), version(1.0), control ] library TestMfcAtlDebugLib { importlib(STDOLE_TLB); // CTestMfcAtlDebugCtrl 的主调度接口 [ uuid(6B60346D-5CCD-4907-83F4-51938558A9B7) ] dispinterface _DTestMfcAtlDebug { properties: methods: [id(DISPID_ABOUTBOX)] void AboutBox(); }; // CTestMfcAtlDebugCtrl 的事件调度接口 [ uuid(E26ECC46-9BA2-4C25-A4DD-A690560A5113) ] dispinterface _DTestMfcAtlDebugEvents { properties: // 事件接口没有任何属性 methods: }; // CTestMfcAtlDebugCtrl 的类信息 [ uuid(DD0CF7EF-A181-428C-B5FC-C44A1C13CA43) ] coclass TestMfcAtlDebug { [default] dispinterface _DTestMfcAtlDebug; [default, source] dispinterface _DTestMfcAtlDebugEvents; }; };
这个就是对外接口定义文件,若是外部程序想要调用ActiveX的方法,属性以及在注册表注册的classid(WEB网页调用须要使用),就必须了解这个文件,这个文件能够分为四个部分来看:
首先是TestMfcAtlDebug.Lib这个库信息
这个就不作详解
第二部分是调度映射的接口信息,该接口信息包含了属性(如控件背景色)和对外方法
里面定义了一个方法AboutBox(),该方法就能够被外部程序调用,在该接口里定义的函数都是纯虚函数,这些函数的实现都是在TestMfcAtlDebugCtrl中完成的,MFC经过底层的封装,让TestMfcAtlDebugCtrl类继承这个接口,实现函数。
第三部分是事件映射的接口信息
第四部分是类的信息,其中uuid就是ActiveX控件注册到注册表的classid,它是ActiveX注册后在系统内的惟一标识,WEB网页就是使用这个ID加载ActiveX控件的
6.定义调度映射和事件映射方法,提供给外部调用者使用
那么怎么定义新的调度映射和事件映射方法呢,若是手动定义很不方便,固然使用编译器进行定义,步骤是打开类视图:
能够看到TestMfcAtlDebugLib中有_DTestMfcAtlDebug和_DTestMfcAtlDebugEvents,在_DTestMfcAtlDebug项中能够右键-》添加方法(或属性),该操做是完成调度映射的方法和属性的添加;在_DTestMfcAtlDebugEvents项中能够右键-》添加方法(或属性),该操做是完成事件映射的方法和属性的添加。
举个例子,若是要添加一个调度映射的方法Fuck2(),使得外部能够调用:
在_DTestMfcAtlDebug项中能够右键-》添加方法,设置框
填写完信息后点击完成,外部就能够调用方法Fuck2,同时ActiveX控件项目代码的内部将会在三个文件中新增代码:
1.在
2.在
3.在
7.注册ActiveX控件
按照上面的步骤已经完成简单ActiveX控件(无窗体界面的控件)的编写,从新生成后会在Debug下生成一个TestMfcAtlDebug.ocx的文件,使用windows的dos窗口能够注册这个ActiveX控件
步骤:
首先win+R键打开运行,而后输入注册命令:regsvr32 c:\.......\TestMfcAtlDebug.ocx(反注册命令:regsvr32 c:\.......\TestMfcAtlDebug.ocx -u)
有两种状况会致使控件注册失败:
第一种:使用非Administrator用户登入系统会因为权限不足而没法注册com组件,这时候就必须使用Administrator用户登入操做系统
第二种:ActiveX控件所依赖的dll库被程序给占用,就会致使注册失败,解决办法是将正在运行的程序关闭就能够
8.测试ActiveX控件的方法
按照上面的步骤已经完成ActiveX控件的编写,也将这个控件注册成功了,那么怎么测试这个控件呢,有三种方式:
第一种:使用html网页来测试
在TestMfcActiveX.htm的文件中编写代码以下:
<HTML> <HEAD> <TITLE>Test ActiveX</TITLE> </HEAD> <OBJECT ID="TestMfcAtl Control" WIDTH=528 HEIGHT=545 classid="CLSID:DD0CF7EF-A181-428C-B5FC-C44A1C13CA43"> <PARAM NAME="_Version" VALUE="65536"> <PARAM NAME="_ExtentX" VALUE="12806"> <PARAM NAME="_ExtentY" VALUE="1747"> <PARAM NAME="_StockProps" VALUE="0"> </OBJECT> </HTML>
注意上面的classid就是在idl文件中类的uuid,而后打开这个网页就会显示ActiveX控件。上面的classid在控件成功注册后也能够经过注册表查找,具体方法是win+R键,输入regedit命令,就会弹出“注册表编辑器”,位置在“HKET_CLASSES_ROOT”中,根据你控件的名称,快速按下前三个字母,而后就能够定位到比较好找的位置,以下图
第二种:创建Mfc应用程序,在Mfc窗口右键-》插入“ActiveX”控件,而后就会在MFC的窗体上显示ActiveX控件
第三种:也是最方便的一种方法,就是使用vs自带的ActiveX Control Test Container来测试ActiveX控件,可是VS2010在“工具”中没有这一项,那么咱们首先能够手动把这个工具添加到VS2010里,首先找到C:\Program Files\Microsoft Visual Studio 10.0\Samples\2052\C++\MFC\ole\TstCon\TstCon.sln,而后使用VS2010打开解决方案TstCon.sln,编译项目TCProps和TstCon,编译完成后会在C:\Program Files\Microsoft Visual Studio 10.0\Samples\2052\C++\MFC\ole\TstCon\Debug\中生成TstCon.exe执行程序,这个执行程序就是ActiveX Control Test Container,接下来咱们就在VS2010中的工具中添加这个TstCon.exe,在VS2010中的“工具”菜单项中选择“外部工具”,在弹出的窗体中添加一个新的工具,标题为ActiveX Control Test Container,命令为C:\Program Files\Microsoft Visual Studio 10.0\Samples\2052\C++\MFC\ole\TstCon\Debug\TstCon.exe,而后点击肯定就能够完成工具的添加了。
这样,在“工具”中就有了一个ActiveX Control Test Container,点击它就会弹出测试ActiveX的容器,以下图
点击Edit->Insert New Control->选择TestMfcAtlDebug Control,点击OK
而后就会显示这个注册后的AcitveX控件,若是要测试这个控件的调度映射的方法Fuck2,就先选中控件,而后点击Control-》Invoke Methods,在Methods Name下拉框中选择Fuck2这个方法,点击Invoke按钮就能够测试这个方法了,以下图:
咱们能够看到上面的ActiveX控件是一个空白的背景和一个圈组成的,并无窗体界面,那么怎么添加窗体呢?
9.向ActiveX控件中添加一个Mfc窗体,就是一个带界面的ActiveX控件
步骤:
第一:在资源视图中新建一个对话框资源
去掉上边的“肯定”和“取消”按钮,而后修改对话框属性:Border改成None,Control改成Ture,ID改成IDD_MAIN_DIALOG,Style改成Child,System改成False,Visible改成True,而后在对话框中双击,为对话框添加一个类,以下图:
点击“完成”。在解决方案资源管理器中新增了一个ViewDialog.h和ViewDialog.cpp这个ViewDialog类就是刚刚咱们创建的对话框类
而后拖一个Edit Control到对话框上,修改其ID为IDC_EDIT_OUTPUT,再拖一个Button到对话框上,此时对话框效果为:
对话框创建完成,接下来就是要把它添加到ActiveX控件中去
第二:在TestMfcAtlDebugCtrl.h中定义对话框实例m_VideoDlg
而后在TestMfcAtlDebugCtrl类中定义两个消息映射:窗体建立完成消息映射和窗体改变大小消息映射
在VS2010的菜单项“项目”--》“类向导”中,选择要添加到的项目和类中,选择“消息”选项卡,选择WM_CREATE后点击”添加处理程序“按钮和选择WM_SIZE
后点击”添加处理程序“,这样在“现有的处理程序”中就有OnCreate和OnSize这两个函数,点击肯定,完成消息映射函数的添加,如图:
在TestMfcAtlDebugCtrl.cpp中自动添加下列代码,如图:
在OnCreate函数中编写以下代码(Create是在ActiveX控件中建立一个窗体对话框,IDD_VIEW_DIALOG就是刚刚新建的对话框):
在OnSize函数编写代码以下(MoveWindow是肯定窗体对话框在ActiveX中的大小):
第三:从新编译,注册ocx,使用ActiveX Control Test Container再次测试该控件
能够发现这个ActiveX控件中已经有了界面了