APP下载

用ATL制作ActiveX控件及其使用

2017-06-05蔺新华

电脑知识与技术 2017年10期
关键词:通讯

蔺新华

摘要:随着软件开发技术的发展,COM组件在现代编程中越来越重要,不懂得COM就很难跟上时代。COM为程序员开发Windows应用程序带来了便利,而COM最令人瞩目的实现就是ActiveX控件。该文介绍了如何用ATL技术制作轻量级的ActiveX控件,怎样在客户容器中与ActiveX控件通讯。

关键词:COM;ATL;ActiveX;通讯

中图分类号:TP3

文献标识码:A

文章编号:1009-3044(2017)10-0057-03

1.CoM,ActiveX和ATL概述

COM(Component Object Model,组件对象模型)是Windows操作系统的技术和核心,是搭建Windows应用程序的基础,COM技术规范描述了一种创建组件即可重复使用的对象的方法,它提供了一种基于接口查询的机制来完成对象之间的通讯,以客户/服务器程序的体系结构协同完成特定的功能,COM已经成为新世纪的Windows程序员必须掌握的技术,同时该技术已经成为Microsoft公司开发方向的重点,COM技术最令人瞩目的就是AcfiveX控件,ActiveX控件可以看作一种早期产品(即VBX)的延伸,同VBX相比,ActiveX定义了一个对程序设计语言中立的接口,ActiveX提供了如下的特性:

1.1语言的无关性

这使得基于Windows平台的开发工具可以混用AcfiveX控件,例如你可以用C++编写,而在Visual Basic中使用,达到二进制的设计标准。

1.2软件版本升级的健壮性

ActiveX控件通过提供多接口机制支持软件版本升级的健壮性,ActiveX控件的不同功能用不同的接口向外展示,要为旧的组件添加新的功能时,为组件新添加一个接口就行了,这样旧的应用程序在不进行更新的情况下运行,同时新的应用程序可以通过查询新接口利用组件的新功能。

1.3面向对象的特性

ActiveX控件允许以面向对象的方式傳递其功能,AcfiveX控件提供三种基本的面向对象的特性,即封装性、继承性和多态性,并且是以一种语言无关的方式提供的。

1.4位置透明性

ActiveX控件的用户并不需要明确的了解它所处的位置,它可能在一个DLL(同一进程)中,可能在一个EXE(不同进程)中,也可能在一个远程计算机上(分布式组件对象)。

早期开发ActiveX控件时,必须用MFC类库,与其相比,用ATL(Active Template Library,活动模板库)开发ActiveX控件具有如下优点:小型、快速、不依赖任何DLL文件,用ATL制作的ActiveX控件能更好地支持以上特性,现在,ATL逐渐成为未来的Windows程序开发中C++的框架,它已经成为Visual c++开发环境的一部分,能更好地支持ActiveX的特性。

2.用ATL开发一个ActiveX控件

2.1建立工程

利用VC的向导新建一工程,工程类型为ATL COM Ap-pWizard,工程名为MyATLActiveX,单击OK,进人下一步,选择Dvnamic Hnk Library(DLL)服务类型,其他保持缺省设置。

2.2建立对象框架

将工作空间窗口切换到Class View面板,右键点击MyAT-LActiveX Class,在弹出的菜单中选择NewATLObject项,进人ATL Object Wizd向导,在向导第一步中选择Coned类别和Full Control对象,单击下一步,在接下来的下一步中对新建的COM对象的属性进行设置,在Names页的ShortName框中输入组件的名字,我们输入MyATLAcfiveXCfl,其它由向导自动填充;在Attributes页中我们需要对COM对象的线程模型、接口类型等进行设置,我们设置如图1:

单击确定,生成MyATLActiveXCfl对象的框架,系统为我们添加了IMyATLActiveXCtl接口(输入接口)、_IMyATL Ac-tiveXCflEvents接口(输出接口)、MyATLActiveXCfl类、MyAT-LActiveX,idl文件(接口描述语言文件)。

2.3添加方法

2.5建立代理类

要使客户容器能够使用ActiveX控件的输出函数,必须为事件创建代理类,这是COM技术的规范,便于与组件通讯时数据的传递,在MyATLActiveXCtl类上单击右键,在弹出的菜单中选择Implement Connection Point项,进入连接点向导,如图2所示,选择_IMyATLActiveXCtlEvents接口,单击OK按钮,向导自动为我们添加了CProxy_IMyATLActiveXCtlEvents代理类及文件MyATLActiveXCP,h,并在此文件中实现了事件Fire_Re-turnData(short ResData)。

2.6重载OnDraw函数提供控件状态的反馈

利用Windows API函数中的GDI函数绘出控件,控件的背景采用红色,在控件中显示一个标签Data和若干兰色小方框,小方框的个数由方法SetData的参数决定。

选择Builder菜单下的Builder MyATLActiveX,dll,完成Ac-tiveX控件的编译、注册。

3.在容器中与ActiveX通讯

3.1建立工程

利用VC的向导新建基于Dialog based的工程,工程名为MyActiveXCon,其它保持缺省设置。

3.2设计界面

首先要做的是在对话框中安置ActiveX控件,右击对话框,在菜单中选择Insert AcitveX Control项,在对话框中选定MyAT-LActiveX Control项,再按OK,则刚建立的ActiveX控件出现在对话框中,调整其到合适位置和大小。

下一步是将对话框和组件连在一起,在可以与MyATLAc-tiveX控件通讯(调用控件或从中接收事件)之前,必须将它添加到项目中,为此,可通过类向导为控件添加一个成员变量,从View菜单中选ClassWizard项,在MFC ClassWizard对话框中选Member Variables页;选择ActiveX控件的ID:IDC_MYAT-LACTIVEXCTLl,再选Add Varible按钮,出现Confirm Classes对话框(见图3),接受默认值并按OK,出现Add Member Vari-able对话框,可将此变量命名为m_MyControl,再按OK,你会发现CMyATLActiveX类现在已是项目的一部分了。

3.3响应事件

响应来自ActiveX控件的事件,右击对话框,在弹出的菜单中选择Events项,在弹出的对话框中的Object to Handlers列表框中选择IDC_MYATLACTIVEXCTLl,在事件列表框中选择我们上面建立的事件ReturnData,然后单击Add and Exit,系统自动为我们把事件处理函数添加到项目中,我们把此函数进一步完善(黑体部分为自己加入)。

响应来自窗体的事件,双击对话框资源上的单选按钮,系统自动为我们把事件处理函数添加到项目中,我们把此函数进一步完善(黑体部分为自己加人)。

本程序在VC++6.0下调试通过,运行结果如图4所示,用鼠标单击不同的单选按钮,ActiveX控件中兰色小方框的数目随着改变,同时反映从控件返回信息的只读文本框的内容也随着变化,从而实现了与控件的通讯。

猜你喜欢

通讯
《茶叶通讯》简介
《茶叶通讯》简介
通讯报道
《茶叶通讯》简介
《茶叶通讯》简介
关于加注“通讯作者”的要求
科技与通讯
本期通讯之星:郭雨薇
本期通讯之星:王宁
通讯简史