1.ActiveX的基本概念

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.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控件中已经有了界面了

C++ 使用VS2010创建MFC ActiveX工程项目的更多相关文章

  1. [ActiveX]使用VS2010创建MFC ActiveX工程项目

    ActiveX的基本概念 ActiveX控件可以看作是一个极小的服务器应用程序,它不能队列运行,必须嵌入到某个容器程序中,与该容器一起运行.这个容器包括web网页,应用程序窗体等等. ActiveX控 ...

  2. c++ ActiveX基础1:使用VS2010创建MFC ActiveX工程项目

    1.ActiveX的基本概念 ActiveX控件可以看作是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一起运行.这个容器包括WEB网页,应用程序窗体等... Activ ...

  3. 【VS开发】使用VS2010创建MFC ActiveX工程项目

    1.ActiveX的基本概念 ActiveX控件可以看作是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一起运行.这个容器包括WEB网页,应用程序窗体等... Activ ...

  4. VS2010开发MFC ActiveX,摄像头拍照上传Webservice(1)

    最近工作项目,BS中需要用到摄像头拍照,需要存储本地,同时上传到服务器,尝试使用vc++做ActiveX来实现. 完全没有使用过vc,上网搜索各种知识,初步完成.在这里记录下有帮助的资料. 第一步:编 ...

  5. 使用vs2010创建MFC C++ Ribbon程序

    Your First MFC C++ Ribbon Application with Visual Studio 2010 Earlier this month, I put together my ...

  6. VS2010开发MFC ActiveX,摄像头拍照上传Webservice(2)

    继续记录,第二步开发摄像头拍照功能. 使用vfw.h开发摄像头拍照功能,关于vfw网上有很多文章,很多代码可以参考 参考:http://blog.163.com/huangqiao_8/blog/st ...

  7. VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程

      开篇语:最近在弄ocx控件发布到asp.net网站上使用,就是用户在使用过程中,自动下载安装ocx控件.(此文章也是总结了网上好多人写的文章,我只是汇总一下,加上部分自己的东西,在这里感谢所有在网 ...

  8. VS2010下MFC的串口编程

    串口通信简介 一般来说,计算机都有一个或多个串行端口,这些串口提供了外部设备与PC进行数据传输和通信的通道,在CPU和外设之间充当解释器的角色.当字符数据从CPU发送给外设时,这些字符数据将被转换成串 ...

  9. 【转】VS2010下MFC的串口编程

    串口通信简介 一般来说,计算机都有一个或多个串行端口,这些串口提供了外部设备与PC进行数据传输和通信的通道,在CPU和外设之间充当解释器的角色.当字符数据从CPU发送给外设时,这些字符数据将被转换成串 ...

随机推荐

  1. 《linux性能及调优指南》 3.4 硬盘瓶颈

    翻译:Hank (http://blog.csdn.net/fireroll)版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明.原文名称:<Linux Performance an ...

  2. bzoj2555 substring(LCT 后缀自动机)

    /* 动态求right集合的大小 LCT维护parent树即可 注意 由于树是有向的不会换根并且每次操作单一, 于是不需要维护子树和(写起来很麻烦) 直接打标记修改即可 */ #include< ...

  3. 非阻塞套接字编程, IO多路复用(epoll)

    非阻塞套接字编程: server端 import socket server = socket.socket() server.setblocking(False) server.bind(('', ...

  4. FreeMarker之FTL指令

    assign指令 此指令用于在页面上定义一个变量 (1)定义简单类型: <#assign linkman="周先生"> 联系人:${linkman} (2)定义对象类型 ...

  5. ROS学习手记 - 2.1: Create and Build ROS Package 生成包(Python)

    ROS学习手记 - 2.1: Create and Build ROS Package 生成包(Python) 时隔1年,再回来总结这个问题,因为它是ros+python开发中,太常用的一个操作,需要 ...

  6. code signing is required for product type 'Application' in SDK 'iOS 8.1' 错误分析以及解决方案

    在真机测试的时候往往会突然出现这样一个错误,code signing is required for product type 'Application' in SDK 'iOS 7.0'  ,就是说 ...

  7. http 文件传输

    http 文件传输 https://www.zhihu.com/question/58118565 转载自:http://www.voidcn.com/article/p-rpdhbjib-m.htm ...

  8. 43. 根据某个字段查询的重复的记录,例:查testId重复的记录

    select t.* from test t    where t.testId in (select testIdfrom test group by testIdhaving count(test ...

  9. DDD随笔-Axon

    1. 命令处理程序从存储库中检索域对象(聚合)并执行它们的方法来更改它们的状态.这些聚合通常包含实际的业务逻辑,因此负责维护自己的状态.聚合的状态变化导致产生领域事件.领域事件和聚合形成领域模型. 2 ...

  10. 白鹭引擎 - 显示对象与 HelloWord ( 绘制了一个红蓝相间的 2 x 2 格子 )

    1: 白鹭引擎默认实在一个 640 * 1136 的画布上作画 2: 入口文件 Main.ts,  类 Main 是程序的入口 // 1, 在一个宽高为 640 * 1136 的画布上作画 // 2, ...