1.ActiveX的基本概念html
ActiveX控件能够看做是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一块儿运行。这个容器包括WEB网页,应用程序窗体等。。。编程
ActiveX控件的后缀名是OCX或者DLL。通常是以OCX和动态库共存的形式打包成cab或者exe的文件放在服务器上,客户端下载后运行安装cab或exe解压成OCX和动态库共存的文件,而后注册ocx文件。浏览器
ActiveX控件是基于com标准,使得软件部件在网络环境中进行交互的技术集。它与具体的编程语言无关。做为针对Internet应用开发的技术,ActiveX被普遍应用于WEB服务器以及客户端的各个方面。同时,ActiveX技术也被用于方便地建立普通的桌面应用程序,此外ActiveX通常具备界面。服务器
2.三个概念:ActiveX、OLE和COM网络
从时间的角度讲,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.VS2010建立ActiveX函数
新建名为MyFirstActive的工程,如图工具
点击【ok】,随后一路保持默认便可,最后点击【Finish】按钮测试
能够打开上面三个类的头文件及cpp文件,发现它们都是派生类。ui
MyFirstActive.cpp:cpp文件中定义了DllRegisterServer和DllUnregisterServer,能够发现ActiveX的注册和反组册都与该类有关。
MyFirstActiveCtrl.cpp:能够发现该头文件中声明了消息映射(让ActiveX控件程序能够接受系统发送的事件通知,如窗体建立和关闭事件),调度映射(让外部调用程序(包含ActiveX的容器)能够方便地访问ActiveX控件的属性和方法),事件映射(让ActiveX控件能够向外部调用程序(包含ActiveX的容器)发送事件通知)。也就是说对ActiveX控件的窗口操做都将在这个类中完成,包括ActiveX控件的建立,重绘,以及在此类中建立可视MFC窗体。
MyFirstActivePropPage.cpp:显示ActiveX控件的属性页的
最重要的对外接口定义文件MyFirstActive.idl,代码以下:
// MyFirstActive.idl : type library source for ActiveX Control project. // This file will be processed by the MIDL compiler tool to // produce the type library (MyFirstActive.tlb) that will become a resource in // MyFirstActive.ocx. #include <olectl.h> #include <idispids.h> [ uuid(0FEFC517-CA1A-4178-B11F-5CE5CF0861DB), version(1.0), control ] library MyFirstActiveLib { importlib(STDOLE_TLB); // Primary dispatch interface for CMyFirstActiveCtrl [ uuid(9B11CEE7-1974-4579-ACDD-551DD26AC5D9) ] dispinterface _DMyFirstActive { properties: methods: [id(DISPID_ABOUTBOX)] void AboutBox(); }; // Event dispatch interface for CMyFirstActiveCtrl [ uuid(28CECEEF-A69E-4124-82AD-FE45F093FE84) ] dispinterface _DMyFirstActiveEvents { properties: // Event interface has no properties methods: }; // Class information for CMyFirstActiveCtrl [ uuid(260A0C6E-1C89-4BB7-A0DD-C1496245094B) ] coclass MyFirstActive { [default] dispinterface _DMyFirstActive; [default, source] dispinterface _DMyFirstActiveEvents; }; };
这个就是对外接口定义文件,若是外部程序想要调用ActiveX的方法,属性以及在注册表注册的classid(WEB网页调用须要使用),就必须了解这个文件,这个文件能够分为四个部分来看:
首先是MyFirstActiveLib这个库信息
第二部分是调度映射的接口信息,该接口信息包含了属性(如控件背景色)和对外方法
里面定义了一个方法AboutBox(),该方法就能够被外部程序调用,在该接口里定义的函数都是纯虚函数,这些函数的实现都是在MyFirstActiveCtrl.cpp中完成的,MFC经过底层的封装,让MyFirstActiveCtrl类继承这个接口,实现函数。
第三部分是事件映射的接口信息
第四部分是类的信息,其中uuid就是ActiveX控件注册到注册表的classid,它是ActiveX注册后在系统内的惟一标识,WEB网页就是使用这个ID加载ActiveX控件的
编译,就会生成MyFirstActive.ocx,下面讲一下使用方法:
1.使用html网页
<HTML>
<HEAD>
<TITLE>Test ActiveX</TITLE>
</HEAD>
<OBJECT ID="TestMfcAtl Control" WIDTH=800 HEIGHT=545 classid="CLSID:260A0C6E-1C89-4BB7-A0DD-C1496245094B">
<PARAM NAME="_Version" VALUE="65536">
<PARAM NAME="_ExtentX" VALUE="12806">
<PARAM NAME="_ExtentY" VALUE="1747">
<PARAM NAME="_StockProps" VALUE="0">
</OBJECT>
</HTML>
2.创建Mfc应用程序,在Mfc窗口右键-》插入“ActiveX”控件,而后就会在MFC的窗体上显示ActiveX控件
3.也是最方便的一种方法,就是使用vs自带的ActiveX Control Test Container来测试ActiveX控件,可是VS2010在“工具”中没有这一项,那么咱们首先能够手动把这个工具添加到VS2010里,
首先,打开C:\Program Files\Microsoft Visual Studio 10.0\Samples\1033,解压VC2010Samples.zip
解压后,再打开目录C:\Program Files\Microsoft Visual Studio 10.0\Samples\1033\VC2010Samples\C++\MFC\ole\TstCon,打开TstCon.sln
编译,生成TstCon.exe,而后把这个exe导入到VS2010中,点击【Tools】——【External Tools】,
Command路径就是刚才生成TstCon.exe的路径,Title就是一个名称,随便你起均可以的,最后点击ok,这个外部exe就添加成功了。
怎么使用?点击【Tools】——【ActiveX Control Test Container】以下
再点击【Edit】——【Insert newControl】
选择MyFirstCtrl,这里咱们没有手动注册,实际上是VS2010在生成ocx的时候就已经注册好了
而后点击【ok】按钮,以下
中间没跳出什么异常,显示上图画面,说明咱们的ocx建立成功了(固然使用的是默认的,什么都没有)
下面咱们在Ocx中添加一些图形控件用于显示和操做,首先,插入一个对话框资源
生成一个IDD_DIALOG1,而后修改对话框属性:Border改成None,Control改成True,Style改成Child,Visible改成True, 而后双击该对话框,生成一个与之关联的类,这里起名CActiveXTestDlg
点击【Finish】。
在MyFirstActiveCtrl.h中添加以下代码:
用Class Wizard为CMyFirstActiveCtrl类添加OnCreate函数
在MyFirstActiveCtrl.h中自动生成以下代码
在MyFirstActiveCtrl.cpp中自动生成以下代码
而后,在该函数中建立对话框的对象
int CMyFirstActiveCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here m_ActiveXTestDlg.Create(IDD_DIALOG1, this); return 0; }
编译,用外部工具加载ocx(前面已讲),结果以下(若是看不到对话框,能够把矩形框拉大就能够看到了)
这样带界面的ocx就生成了,另外能够在CActiveXTestDlg类中加入【ok】按钮响应函数
void CActiveXTestDlg::OnBnClickedOk() { // TODO: Add your control notification handler code here //CDialogEx::OnOK(); AfxMessageBox(_T("ActiveX test is ok!")); }
这样,在测试程序中点击【ok】按钮,就会弹出以下对话框
备注:若是想要修改初始的ActiveX控件大小,能够在CMyFirstActiveCtrl构造函数中调用 SetInitialSize( 470, 295 ); 来设置
ActiveX控件跟踪调试:
运行TstCon.exe,而后用ocx的工程Attach到该exe,就能够调试了。