转自(http://blog.csdn.net/mingojiang/article/details/8159263

一、ActiveX基础

1.1什么是ActiveX

ActiveX是COM规范的一种实现,前身是OLE(Object Linking and Embedding)。一般读成:ActiveX Ctronl,译成:ActiveX控制,ActiveX控件。即可用于桌面也可用于网络,是封装、跨平台(兼容)与重用技术的延伸。封装与重用技术大概经历了以下几个历史阶段:

明码复用:就是写的代码,例如一个函数,通过复制粘贴方式重用;

库:把代码进行封装,只让使用者看到接口,不能看到具体内容,但是编译时静态库将一起载入,导致可执行文件庞大,且不宜升级,如果库中的内容有改动,则必须再次编译。

动态库:动态库发行接口不变的情况下,无须再编译主程序,升级方便,而且可以实现动态载入。

COM技术:但是动态库有环境兼容问题,C#写的动态库C++访问可能会有一定的问题,再一个如果同一台计算机中有N个程序要用到同一个动态库,那么要载入N次。COM技术能解决此问题,通过引用计数技术,只载入一次,大家共用资源,COM技术接口是统一的与语言无关,解决各种语言之间兼容问题。

COM+、DCOM技术:COM技术不能解决网络资源共享问题,只适用于单机,COM+、DCOM技术解决了此问题。不同计算机可通过网络远程共享资源。

ActiveX技术:在COM+、DCOM基础上发展了可视化,事件驱动,Web调用等。主要是Web上的应用,通过ActiveX技术能让Web像桌面程序一样与其他软件交互,如让Web与其他软件通过TCP/UDP方式通信; 也可以通过ActiveX让Web与串口通信。

注:ActiveX不支持自定义数据类型,DLL支持

配套源码:http://download.csdn.net/detail/mingojiang/4743623

1.2ActiveX应用领域

随着软件技术的发展,程序的开放性、可重用性与封装变得越来越重要,而ActiveX是提高程序的开放性、可重用性和封装性的重要手段,现在ActiveX已经应用于数据管理、图形显示、用户界面、界面加密与接口封装等。

对某些技术进行封装,以供直接调用,因为它有兼容的统一接口,可以给C++、Delphi、C#与VB等语言调用。应用举例:

1.有个客户端C要与服务端S通过UDP协议交互,C端发送的数据包是按某种协议封装的数据,如果不想(或者说S端不愿意去解析这种复杂的协议)向S端暴露具体协议,那么我们可以用ActiveX技术开发一个ActiveX控件,把C端上行的数据解析成S端默认的一种格式,S端下行给C端的数据,通过ActiveX解析成C端能识别的一种协议。在此解决两个问题:一、两种协议的转换,S端与C端之间相互不需要知道对方细节。二、不同平台的兼容问题,C端可能是C开发的,S端可能是C#开发的,不管什么环境ActiveX都能兼容。

2.学校A从IC卡读卡器生产厂家买了批读卡器与IC卡,准备开发一个网站,用来读写IC卡。IC卡读卡器与PC机串口相连,点击页面上的读、写等按钮能对IC写进行操作。开发网站用C#开发,直接访问读卡器不方便,这时厂家可以提供一个ActiveX控件,封装所有对读卡器的操作,网站直接访问ActiveX控件即可。

3.车管所部门A是专门管理各个驾校的,A部门开发了一个Web平台,以供各个驾校上传其学员学习的动态数据(每天的学习情况,理论课学了多少小时,实操学了多久等信息)。有些驾校学员动态数据可能保存在电脑上,有些可能保存在学员的IC卡上,有些保存在远程数据库上等等,不同驾校千差万别,如何让不同的驾校按A部门的要求上传数据呢?最好的方法是A部门定义一个统一的接口,例如ActiveX控件,公布ActiveX的接口、参数定义就可,各个驾校自己按照A部门公布的要求开发自身的ActiveX控件即可,A部门就不去动管数据的来源,具体实现。

4.WebQQ如何实现的呢?一般的人的做法是借助数据库。如A与B两个QQ聊天,A向B发信息“你好”流程是这样的:A访问数据库把“你好”写入数据库,B一定时间内到数据库查看是否有属于自己的数据,然后把“你好”下载下来,B向A发信息也是一样的流程。如果这样架构是不行的,用户一多数据库无法承受,再一个实时性极差,三这种架构一看就感觉很傻。如果用ActiveX会比较好的解决这个问题,开发一个ActiveX控件启动UDP或者TCP服务,A与B需要交互时,通过服务器知道对方信息,然后建立端对端通信,A直接向B发信息,B也直接向A发信息,无需通过数据库。

1.3ActiveX分类

按运行方式分,可分为进程内与进程外服务器,进程内是指ActiveX与包容器同一个进程一般以Dll形式发行,进程外是指与包容器不同一个进程,其以独立方式运行,一般以exe文件方式发行。

按运行地点分,可分为本地服务器与远程服务器,本地是指ActiveX与包容器同一计算机运行,不言而喻远程服务器那就是不同一计算机上运行。

二、ActiveX开发工具

2.1选择适合的开发工具

开发ActiveX的工具一般都是Microsoft提供的,因为ActiveX也是Microsoft提出的嘛,一般有Visual C++ 、Visual Basic、Visual J++、Visual FoxPro各Office系统产品等都能生成ActiveX组件。一般比较全面、灵活的是Visual C++,使用Visual C++时也有四种选择:

1.使用Microsoft基础类库----MFC

2.使用ActiveX模板库----ALT

3.使用BaseControl框架----BaseCtl

4.自己建框架

2.1.1MFC开发ActiveX

是主要选择,Visual C++提供了完美的支持,但是有几个小问题,如:把ActiveX做成单实例的----不管客户程序如果创建实例,都是返回同一个实例。如果使用MFC开发对开发人员的技术要求很高;再如:且MFC开发ActiveX实现双接口并不是不可能,但是要对代码进行修改,而且可能导致类向导无法工作。

2.1.2ALT开发ActiveX

简单便捷,开发的ActiveX轻便,支持MFC改善了MFC的几个小问题,并不断发展将可能成为ActiveX开发的主流工具。

2.1.3 BaseCtl开发ActiveX

BaseCtl并不是一个成熟主流的产品,我们权且不去说它吧

2.1.4自己写框架

太过繁琐复杂,不建议用。

2.1.5工具选择小结

MFC适合组件的快速生成与实现,VC++集成开发环境对MFC的支持程序比ALT各BaseC

tl要好,MFC包含的类库几乎能解决所以的问题,MFC包罗万象也导致了应用程序开发速度较慢,而且很难实现一些特殊需求。

ATL提供了用于生成ActiveX组件的小型而精致的框架,然而与MFC比,更缺少对通用类的支持,ATL与VC++开发环境之间的集成也有待改进。

2.2注册表与ActiveX

所有ActiveX组件的信息都保存在注册表中,没了注册表ActiveX将无法工作。ActiveX的信息存储在KEY_CLASSES_ROOT键下的CLSID子键中。

2.2.1注册表发展史

注册表是一系列数据文件,主要功能是帮助Windows对硬件、软件、用户环境以及Windows的“外观与感觉”进行控制。在此之前这类工作主要由Win.ini、System.ini以及程序相应的.ini文件完成。主要经历了以下三个阶段的演变:

1.统一记录于Win.ini与System.ini

2.记录在自己的ini文件中

3.记录在注册表中

2.2.2注册表结构

Windows注册表一般分为五大根键:

  1.KEY_CLASSES_ROOT          :存放的信息是HKEY_LOCAL_MACHINE的一部份,应用程序信息与系统信息。

  2.HKEY_CURRENT_USER        :存放的信息是HKEY_LOCAL_MACHINE、HKEY_USERS的一部份,当前用户的所有信息。

  3.HKEY_LOCAL_MACHINE      :保存用户信息,计算机中的所以用户的信息。

  4.HKEY_USERS                     :当前用户桌面与环境信息。

  5.HKEY_CURRENT_CONFIG    :计算机硬件等信息。

三、ActiveX基础----COM

3.1什么是COM

COM是种规范,叫组件对象模型(Component Object Model),以组件为发布单元的对象模型,规范提供了统一的方式进行交互,不依赖于任何语文,也是不同语文之类协作开发的一种标准。

COM的主要思想是把一个大项目切成N小块,每个小块可以由不同的团队,不语言开发只要各个模块遵循COM规范就可协同工作。这样灵活化、升级方便、问题快速定位开发自由化。

有关COM的知识参看《Visual C++实践与提高-COM和COM+篇》。

四、使用MFC开发ActiveX

4.1ActiveX基本概念

ActiveX是进程内服务器实现,不能像COM一样实行进程外。ActiveX容器一般指给ActiveX控件提供支持,还可能通过ActiveX的属性方法对ActiveX进行控制,同时还可以响应ActiveX的事件消息。ActiveX控件使用事件来通知ActiveX容器有关ActiveX控件的发生的事情。常用的事件有鼠标消息,键盘消息等。

4.2属性

属性可分为公共属性与自定义属性,公共属性是指ActiveX默认的一些属性,如Caption、背景色、字体等。自定义属性是个性定义属性。

属性一般有三种实现,如下图:

第一个实现方法针对公共属性的,加此属性后,如加一个Caption属性后,选择Stock,在发行的ActiveX控件中会有GetCaption与SetCaption两个方法,而且方法的实现默认实现,但是没有具体的属性,如m_Catption之类的变量。

第二个实现方法对公共属性与自定义属性都可用,有具体的属性变量可明码调用,在发行的ActiveX控件中也将有Get与Set方法,且默认实现,同时在ActiveX控件中还有一个函数,当相应的属性改变时,这个函数将被调用。如下图,当m_backColor被改变时,OnBackColorChanged将被调用:

第三个实现方法,不会有具体的属性(变量),也不会有默认现实代码,只是会增加两个方法(Set和Get),这两个方法专门操纵某发生用而已,Set带一参数用来设置某属性,Get不带参,返回某一属性。

4.2.1Stock实现属性

些属性是针对公共属性的,自定义属性没有。公共属性一般会有Caption、Color、Font等,以Font为例,选择Stock,如图:

发行的ActiveX控件中将会有GetFont与SetFont两个方法,ActiveX控件本身不会有GetFont与SetFont两个方法,都是默认实现,也不会有Font的具体属性。但是Font将默认生效。

4.2.2通知特性属性

以公共属性Font为例,当m_font属性被改变(可通过SetFont改变,也可直接对其进行修改)时OnFontChanged将被调用:

再以自定义属性m_nCount属性为例,在External name输入属性名,在Type框中选择属性数据类型,如下:

在ActiveX控件中将默认实现Get与Set方法,如GetnCount与SetnCount,而且m_nCount属性改变时,OnNCountChanged将被调用,可在OnNCountChanged中实现自己的操作。

对属性初始化:对增加的属性可初始化,在控件类的实现文件的DoPropExchange方法中加上初始化代码,如下:

PX_是固定格式,_后面是数据类型,因为m_nCount是long型,所以是PX_Long,如果nCount是short型则是PX_Short,第一个参数pPX是固定格式,第二个参数是属性名一般是把属性前面的”m_”去掉后即是,第三个为属性本身,第四个为给属性武的初始值。

4.2.3Get/Set类型属性

此类型属性其他是取/设相应属性的方法而已,且通过向导只会加两个方法具体实现代码得自己写,如果没不写具体实现代码,对ActiveX将无任何影响。至少有一个参数,如果想加其他参数,可在参数列表中加:

在ActiveX代码中将增加GetBFlag与SetBFlag方法,实现代码得自己写;Type中必须先一个参数类型,在Paramete list列表中可增加其他参数。

4.3方法

ActiveX的方法是向外公开的接口,通过方法结合属性可很好的与ActiveX控件通信,当时还可能过触发事件的方式来通信,如下:

此方法是返回一串字符串,参数是字符指针,返回值是long型,实现代码自己实现,在发行的ActiveX控件中将能访问到此接口。参数列表中能添加各种类型的参数。

4.4事件

事件分公共事件与自定义事件,是ActiveX主动向ActiveX容器发出通知的一种机制。

4.4.1自定义事件

通过类向导增加事件,输入事件名:

在External name中输入名字,这个是外用名,就是AxctiveX发行后,使用者能看到的名字,Internal name是ActiveX内部使用的名字,一般在外用名前加Fire,下面是参数列表,自行配置即可。

自定义事件的触发:在ActiveX内部相应的地方调用FireUpInfo,ActiveX的包容器中将会收到此事件,自动调用相应的事件,以达到ActiveX主动通知ActiveX包容器的目的。

4.4.2公共事件

一般都是鼠标事件与键盘输入事件,默认增加即可,增加后,在ActveX包容器中就能接收到相应的事件,如鼠标按下、弹起、移动等消息。

4.5页面属性及其他

本人一般不关心界面开发,所以页面属性及其他属性不深入研究。

ActiveX开发的更多相关文章

  1. C# Activex开发、打包、签名、发布 C# Activex开发、打包、签名、发布 [转]

    C# Activex开发.打包.签名.发布 2013-06-22 12:01:20 浏览:3823 一.前言 最近有这样一个需求,需要在网页上面启动客户端的软件,软件之间的通信.调用,单单依靠HTML ...

  2. .Net魔法堂:史上最全的ActiveX开发教程——ActiveX与JS间交互篇

    一.前言 经过上几篇的学习,现在我们已经掌握了ActiveX的整个开发过程,但要发挥ActiveX的真正威力,必须依靠JS.下面一起来学习吧! 二.JS调用ActiveX方法 只需在UserContr ...

  3. .Net魔法堂:史上最全的ActiveX开发教程——自动更新、卸载篇

    一.前言 B/S模式的特点之一,客户端版本升级相对简单.快捷,适合产品的快速迭代.而ActiveX组件的自动更新同样也继承了这一优点.下面我们一起来了解吧! 二.二话不说更新ActiveX 1. 设置 ...

  4. .Net魔法堂:史上最全的ActiveX开发教程——部署篇

    一.前言 接<.Net魔法堂:史上最全的ActiveX开发教程——发布篇>,后我们继续来部署吧! 二. 挽起衣袖来部署   ActiveX的部署其实就是客户端安装ActiveX组件,对未签 ...

  5. .Net魔法堂:史上最全的ActiveX开发教程——发布篇

    一. 前言 接着上一篇<.Net魔法堂:史上最全的ActiveX开发教程——开发篇>,本篇讲述如何发布我们的ActiveX. 二.废话少讲,马上看步骤! 1. 打包  C#开发的Activ ...

  6. .Net魔法堂:史上最全的ActiveX开发教程——开发篇

    一.前言 在设计某移动内部自动化运维平台时,经综合考虑终端机性能和功能需求等因素后,决定采用B/S模式,并且浏览器通过ActiveX组件实现与服务器Agent作P2P的通讯.好处,整个平台以网页形式存 ...

  7. 基于MFC的ActiveX控件开发教程------------浏览器插件之ActiveX开发

    浏览器插件之ActiveX开发(一) 一般的Web应用对于浏览器插件能不使用的建议尽量不使用,因为其涉及到安全问题以及影响用户安装(或自动下载注册安装)体验问题.在有特殊需求(如涉及数据安全的金融业务 ...

  8. 【VS开发】ActiveX开发注意事项

    [VS开发]ActiveX开发注意事项 标签:[VS开发] 注意:必须在工程的app文件的InitInstance()中加入如下代码,否则动态创建控件不会成功: AfxEnableControlCon ...

  9. C# Activex开发、打包、签名、发布

    一.前言      最近有这样一个需求,需要在网页上面启动客户端的软件,软件之间的通信.调用,单单依靠HTML是无法实现了,因此必须借用Activex来实现.由于本人主要擅长C#,自然本文给出了用C# ...

随机推荐

  1. python采用pika库使用rabbitmq总结,多篇笔记和示例(转)

    add by zhj:作者的几篇文章参考了Rabbitmq的Tutorials中的几篇文章. 原文:http://www.01happy.com/python-pika-rabbitmq-summar ...

  2. SHFileOperation的用法

    //删除文件或者文件夹bool DeleteFile(char * lpszPath){SHFILEOPSTRUCT FileOp={0};FileOp.fFlags = FOF_ALLOWUNDO ...

  3. mysql 数据操作 单表查询 group by 练习

    小练习: 1. 查询岗位名以及岗位包含的所有员工名字 mysql> select post,group_concat(name) from employee group by post ; +- ...

  4. Sparsity稀疏编码(二)

           为了更进一步的清晰理解大脑皮层对信号编码的工作机制(策略),需要把他们转成数学语言,因为数学语言作为一种严谨的语言,可以利用它推导出期望和要寻找的程式.本节就使用概率推理(bayes v ...

  5. Check out our list of adidas NMD Singapore retailers

    The adidas NMD Singapore is confirmed to produce on The month of january 14th at select adidas Origi ...

  6. Know that more adidas NMD Singapore colorways are coming

    The adidas NMD Singapore continues to be the right silhouette for summer time because of a mix of a ...

  7. 在HTML代码中要如何插入空格?

    超文本标记语言(HTML)会自动忽略空格.平常在编写代码的时候,用空格键.Tab键以及回车键产生的空格,都会被HTML自动忽略.那么我们该用什么方法来实现HTML的空格效果呢?有专门的空格代码吗?不少 ...

  8. php array_map array_filter sort

    array_map — Applies the callback to the elements of the given arrays (处理映射) array_filter — Filters e ...

  9. Python 操作 SQL 数据库 (ORCAL)

    MySQLdb.connect是python 连接MySQL数据库的方法,在Python中 import MySQLdb即可使用,至于connect中的参数很简单:host:MySQL服务器名user ...

  10. TED #03# 10 ways to have a better conversation

    Teach you how to talk and how to listen Many of you have already heard a lot of advice on this, thin ...