用ATL开发和部署ActiveX网页控件.docx

上传人:b****0 文档编号:12764774 上传时间:2023-04-22 格式:DOCX 页数:8 大小:19.38KB
下载 相关 举报
用ATL开发和部署ActiveX网页控件.docx_第1页
第1页 / 共8页
用ATL开发和部署ActiveX网页控件.docx_第2页
第2页 / 共8页
用ATL开发和部署ActiveX网页控件.docx_第3页
第3页 / 共8页
用ATL开发和部署ActiveX网页控件.docx_第4页
第4页 / 共8页
用ATL开发和部署ActiveX网页控件.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

用ATL开发和部署ActiveX网页控件.docx

《用ATL开发和部署ActiveX网页控件.docx》由会员分享,可在线阅读,更多相关《用ATL开发和部署ActiveX网页控件.docx(8页珍藏版)》请在冰豆网上搜索。

用ATL开发和部署ActiveX网页控件.docx

用ATL开发和部署ActiveX网页控件

用ATL开发和部署ActiveX网页控件

一、前言

在B/S结构的系统中,出于安全性考虑一般不准许浏览器访问客户端的硬件资源,如控制打印机,照相机等。

对于一个完善系统来说,往往很多时候又需要控制这些资源。

通过在浏览器中插入ActiveX插件是一种很好的解决方式。

在实际的项目开发中,遇到系统登录需要增加物理身份识别。

即在系统登录的时候,除了要验证用户名和密码外,还需要验证硬件USBKEY上的信息。

具体业务流程为:

客户端程序读取用户硬件USBKEY里的个人信息(即加密认证信息),提交给认证服务器进行认证,认证服务器通过身份识别后,业务系统通过解析返回的XML信息判断用户是否合法有效,建立起用户和业务系统的信任通道。

读取硬件USBKEY的信息我们通过本例的ActiveX控件来完成。

硬件USBKEY选用飞天诚信的ePass1000ND产品。

二、概念

1、ActiveX控件

ActiveX是Microsoft提出的一组使用COM(ComponentObjectModel,组件对象模型)使得软件组件在网络环境中进行交互的技术集。

它与具体的编程语言无关。

作为针对Internet应用开发的技术,ActiveX被广泛应用于WEB服务器以及客户端的各个方面。

ActiveX是从Microsoft的复合文档技术—OLE成长起来的。

其基本的出发点是想让某个软件通过一个通用的机构为另一个软件提供服务,可以将其插入到WEB网页或其它应用程序中。

在Internet上的使用,ActiveX特点是:

一般软件需要用户单独下载然后执行安装,而ActiveX插件是当用户浏览到特定的网页时,IE浏览器即可自动下载并提示用户安装。

但安装的一个前提是必须经过用户的同意及确认。

2、COM技术

COM是Microsoft组件对象模型的简称。

是一个说明如何建立可动态交替更新组件的规范。

它提供了客户和组件为保证能够互操作应该遵循的标准。

该标准对于组件架构的重要性同其他任何一个具有可交替更新部分的系统是一样的。

COM标准包括规范和实现两大部分,规范部分定义了组件和组件之间通信的机制,这些规范不依赖于任何特定的语言和操作系统,只要按照该规范,任何语言都可以使用;COM标准的实现部分是COM库,COM库为COM规范的具体实现提供了一些核心服务。

在COM模型中,对象本身对于客户来说是不可见的,客户请求服务时,只能通过接口进行。

一般接口是不会改变的。

3、ATL技术

ATL(ActiveTemplateLibrary)是微软的活动模板库,是一个产生C++/COM代码的框架,专门用于开发COM组件。

ATL提供了小巧、高效、灵活的类,这些类为创建可互操作的COM组件提供了基本的设施。

ATL完全面向COM组件,其结构完全针对COM中的诸多规范。

是编写COM组件的快捷工具。

三、实现

1、项目

打开VisualStudio.Net2005,建立一个解决方案或项目DeanUSBKey。

在项目类型中选择VisualC++下的ATL选项,在模板中选择”ATL Project”,项目名为DeanUSBKey。

点击确定,系统就在指定的目录下建立了DeanUSBKey项目和解决方案。

点击确定后,会出现建立ATL项目向导对话框,引导用户快捷方便的建立ATL项目。

点击下一步,进入项目属性设置对话框,如图1所示。

可以通过该对话框选择是否属性化和发布方式等。

图1项目属性设置对话框

具体选项说明如下:

Attributed即属性化,支持属性化编程,是未来的发展方向,是IDL方案的一种替代方案。

Dynamic-linklibrary(DLL)即动态链接库,表示建立一个DLL的组件程序。

Executable(EXE)即可执行文件,表示建立一个EXE的组件程序。

Service(EXE)即服务,表示建立一个系统服务组件程序,系统启动后就会加载并执行的程序。

Allowmergingofproxy/stubcode即允许合并代理/存根代码,选择该项表示把“代理/存根”代码合并到组件程序中,否则需要单独编译,单独注册代理存根程序。

SupportMFC即支持MFC,建议不要选择,除非有特殊的原因,比如我们原来的程序是基于MFC的,我们的组件必须要MFC的支持。

一般在写ATL程序,不选择该项。

但是很多VC程序员对于MFC的数据集合类和字符串类依赖很大,建议采用STL中的相关类进行替代。

具体替换方案:

1、std:

:

string代替MFC中的CString;

2、std:

:

vector代替MFC的数组类如CArray,CPtrArray等;

3、std:

:

list替换MFC中的CList等列表类;

4、对于BSTR建议采用CComBSTR类,或_bstr_t类,本例子中就会用到该类;

SupportCOM+1.0支持事务处理的COM+功能。

我们选择如图1所示的选项,点击完成。

ATLProject项目就生成好了,系统会在指定目录下生成一系列文件,ReadMe.txt里有各文件的文件说明。

尤其要注意接口定义语言文件(DeanUSBKey.idl),它描述了对象的接口细节。

2、组件

在COM模型中,客户请求服务时,是通过接口和组件进行交互的。

现在还是一个空的ATL项目,还没有任何组件。

添加组件,也就是添加ATL对象类。

在DeanUSBKey项目上点击右键,添加类,弹出对话框。

在类别中选择ATL。

在模板中选择“ATLSimpleObject”即ATL简单对象。

点击确定,出现建立组件向导。

如图2所示,在ShortName输入组件名称USBKey,其它内容系统会自动填写。

注意组件名称不能和项目名称重名。

点击下一步进入组件选项设置界面。

如图3所示图2ATL简单对象组件名字对话框图3ATL简单对象组件选项对话框

具体选项说明如下:

Threadingmodel即线程模型,COM中的线程,这是一个复杂的部分。

我们选"单元"(Apartment),它代表当在线程中调用组件函数的时候,这些调用会排队进行。

如果想了解详细细节可以参看《COM技术内幕》一书。

Interface即接口,双重(Dual),双重接口表示在一个接口中,同时支持自定义接口和IDispatch接口。

这个非常重要,为了能够使组件能够在脚本中使用,必须选择双重接口选项。

因为脚本语言的解释器只认识IDispatch接口。

自定义接口(Custom),直接实现的是IUnknown接口。

Aggregation即聚合,写的组件,将来是否允许被其他人以聚合方式(有聚合和包容两种方式)使用。

Only(只能创建为聚合),有点类似C++或Java中的不能直接创建实例的虚类,如果不是处于设计目的,一般这个选项不用。

大多数情况下支持“聚合”,所以我们选择“Yes”。

ISupportErrorInfo是否支持丰富信息的错误处理接口。

Connectionpoints即连接点,是否支持连接点接口(事件、回调)。

IObjectWithSite是否支持IE的调用。

我们选择如图3所示的选项,点击完成。

USBKey的组件建立完成。

在生成的USBKey.cpp里将是接口IUSBKey的实现。

3、接口方法

在类视图中,IUSBKey接口上点击鼠标右键。

在添加项里有添加方法和属性,选择添加方法。

打开图4所示的添加接口方法对话框。

添加接口方法GetContent,并添加接口方法的参数。

[in]表示参数方向是输入;[out]表示参数方向是输出;[out,retval]表示参数方向是输出,同时可以作为函数运算结果的返回值。

一个函数中,可以有多个[in]、[out],但[retval]只能有一个,并且要和[out]组合后在最后一个位置。

详细的定义说明可以参考IDL的语法说明。

图4添加接口方法对话框

在USBKey.cpp文件里添加函数GetContent的具体实现过程。

核心代码如下:

STDMETHODIMPCUSBKey:

:

GetContent(LONGlFlags,BSTR*pUSBContent)

{

EPAS_STATUSretval;//状态

EPAS_HANDLEepsHandle;//EPAS句柄

//创建设备句柄

retval=epas_CreateContext(&epsHandle,0,EPAS_API_VERSION);//调用EPAS的API函数访问USBKey硬件

if(FT_SUCCESS!

=retval)

{returnReturnError(retval);}//返回相应的错误

//打开设备

retval=epas_OpenDevice(epsHandle,lFlags,(void*)szAppID);

if(FT_SUCCESS!

=retval)

{returnReturnError(retval);}

//得到序列号

unsignedlongsn[2]={0};

retval=epas_GetProperty(epsHandle,EPAS_PROP_SERNUM,NULL,sn,sizeof(sn));

if(FT_SUCCESS!

=retval)

{returnReturnError(retval);}

charm_sn[8*1024+17]={0};

sprintf_s(m_sn,"%08X%08X",sn[1],sn[0]);//以16进制打印到字符串m_sn中

//得到加密字符串

//1、登录

chars[80]="1234";//登录密码

retval=epas_Verify(epsHandle,EPAS_VERIFY_USER_PIN,(unsignedchar*)s,4);

if(FT_SUCCESS!

=retval){returnReturnError(retval);}

//2、打开文件

EPAS_FILEINFOepsFileInfo={0};

unsignedlongepsFileID=0x1234;//文件编号

retval=epas_OpenFile(epsHandle,0,epsFileID,&epsFileInfo,sizeof(epsFileInfo));

if(FT_SUCCESS!

=retval){returnReturnError(retval);}

//3、读取文件内容

unsignedlongrLen=0;

unsignedcharrBuff[8*1024]={0};

ZeroMemory(rBuff,8*1024);

retval=epas_Read(epsHandle,0,0,rBuff,epsFileInfo.ulFileSize,&rLen);

if(FT_SUCCESS!

=retval){returnReturnError(retval);}

//4、关闭文件

retval=epas_CloseFile(epsHandle);

//关闭设备,删除Context

retval=epas_CloseDevice(epsHandle);

retval=epas_DeleteContext(epsHandle);

strcat_s(m_sn,(char*)rBuff);

*pUSBContent=_com_util:

:

ConvertStringToBSTR((char*)r_sn);

returnS_OK;

}

为了能在函数中使用USBKey厂家提供的访问函数和使用BSTR类,需在stdafx.h头文件里面引入相应的.h和.lib文件。

如下:

#include"FT_ND_API.h"//ePass1000ND的接口头文件

#include"comutil.h"

#pragmacomment(lib,"FT_ND_API.lib")

#pragmacomment(lib,"comsuppw.lib")

如果编译通过,VS.NetIDE会打开窗口选择执行控件的外部文件。

选择regsvr32。

编译成功后,组件会自动注册。

可以在系统组件服务里面查看刚注册的组件DeanUSBKey。

4、错误处理

COM方法通过返回HRESULT来报告错误,其他信息异常可以通过IErrorInfo接口提供给客户端,这里主要讲述HRESULT返回COM方法错误。

HRESULT由一个32位代码组成。

分为四部分,如下:

Field

 

Severity

 

Reserved

 

Facility

 

CodeBit(s)

 

31

 

29-30

 

16-28

 

0-15

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1