澳门皇冠金沙网站▎在线官网
做最好的网站

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

2019-11-14 作者:网络服务   |   浏览(93)

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

 

摘 要 ActiveX插件技术广泛的运用于B/S系统中,本文通过一个项目实例,详细介绍用ATL开发和部署ActiveX网页控件的过程。学习使用ActiveX让浏览器访问客户端的硬件资源。

  ATL可以作为一个完整的控件开发框架,它的主要目标是提供方便的开发手段和生成更小的目标文件。由于ATL可以脱离开MFC所以它的执行速度和加载速度都比MFC开发的控件快。当然你也可以在ATL中使用MFC,但这样就失去了ATL的优势,因为利用MFC开发控件在目前来讲还是要比ATL方便和快捷。由于在ATL中不使用MFC所以所有的的功能调用都是通过WIN32 API函数和C运行库函数来完成。但利用ATL我们可以很方便的开发出COM对象,而这点是MFC较弱的地方,但这个问题已经超出了本章的内容。

关键字 ATL,ActiveX控件,COM组件

在本节中通过一个例子来看看如何利用ATL创建一个工程并添加相应的功能,首先利用Class Wizard创建一个ATL工程,在创建时几乎没有什么选项。所有的ATL接口都要在创建后才添加。在菜单Insert中选择New ATL Object...,这时你需要选择Control类中的Full Control项,然后输入对象的名称,并且为了添加容错和事件支持你需要在Attributes选项中选中Support ISupportErrorInfo和Support Connection Points。

 

接下来我们为ATL接口添加方法,然后在对话框中输入方法名称和参数,你可以看到参数定义前可以利用中括号对参数的属性进行定义,可用的指令有:

 

  • in 调用方传入的参数
  • out 给调用方返回的值
  • in,out 既作为输入参数有作为返回值

一、前言

接下来我们添加两个方法:SetCaption([in]BSTR pszCaption)和GetCaptionLength([out]long* lLen)其作用是设置标题和得到标题的字符串长度。相关代码如下:

在B/S结构的系统中,出于安全性考虑一般不准许浏览器访问客户端的硬件资源,如控制打印机,照相机等。对于一个完善系统来说,往往很多时候又需要控制这些资源。通过在浏览器中插入ActiveX插件是一种很好的解决方式。

  STDMETHODIMP CATLSam::SetCaption(BSTR pszCaption)
{
USES_CONVERSION; //由于COM传送字符时使用UNICODE所以在此要进行转换,unicode->ansi
LPTSTR pTemp=W2A(pszCaption);
delete m_pszCaption; //删除原来的数据
m_pszCaption = new char[strlen(pTemp)+1];
strcpy(m_pszCaption,pTemp);
return S_OK;
}
STDMETHODIMP CATLSam::GetCaptionLength(long *lLen)
{
*lLen=strlen(m_pszCaption);
return S_OK;
}

在实际的项目开发中,遇到系统登录需要增加物理身份识别。即在系统登录的时候,除了要验证用户名和密码外,还需要验证硬件USB KEY上的信息。具体业务流程为:客户端程序读取用户硬件USB KEY里的个人信息(即加密认证信息),提交给认证服务器进行认证,认证服务器通过身份识别后,业务系统通过解析返回的XML信息判断用户是否合法有效,建立起用户和业务系统的信任通道。读取硬件USB KEY的信息我们通过本例的ActiveX控件来完成。硬件USB KEY选用飞天诚信的ePass1000ND产品。

  接下来为了在界面上显示出所做的改动,让我们重写OnDraw函数,相关代码如下:

二、概念

HRESUL

1、ActiveX控件

http://www.bkjia.com/Cyy/492977.htmlwww.bkjia.comtruehttp://www.bkjia.com/Cyy/492977.htmlTechArticleATL可以作为一个完整的控件开发框架,它的主要目标是提供方便的开发手段和生成更小的目标文件。由于ATL可以脱离开MFC所以它的执行速度...

ActiveX是Microsoft提出的一组使用COM(Component Object Model,组件对象模型)使得软件组件在网络环境中进行交互的技术集。它与具体的编程语言无关。作为针对Internet应用开发的技术,ActiveX被广泛应用于WEB服务器以及客户端的各个方面。

相关文章

相关搜索:

今天看啥

搜索技术库

返回首页

相关频道: Java编程  C#教程  C语言  C++教程  VC教程  Delphi教程  VB教程  工具软件  

ActiveX是从Microsoft的复合文档技术—OLE成长起来的。其基本的出发点是想让某个软件通过一个通用的机构为另一个软件提供服务,可以将其插入到WEB网页或其它应用程序中。在Internet上的使用,ActiveX特点是:一般软件需要用户单独下载然后执行安装,而ActiveX插件是当用户浏览到特定的网页时,IE浏览器即可自动下载并提示用户安装。 但安装的一个前提是必须经过用户的同意及确认。

2、COM技术

COM是Microsoft组件对象模型的简称。是一个说明如何建立可动态交替更新组件的规范。它提供了客户和组件为保证能够互操作应该遵循的标准。该标准对于组件架构的重要性同其他任何一个具有可交替更新部分的系统是一样的。

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

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

3、ATL技术

ATL(Active Template Library)是微软的活动模板库,是一个产生C++/COM代码的框架,专门用于开发COM组件。ATL提供了小巧、高效、灵活的类,这些类为创建可互操作的COM组件提供了基本的设施。ATL完全面向COM组件,其结构完全针对COM中的诸多规范。是编写COM组件的快捷工具。

三、实现

1、项目

打开Visual Studio.Net 2005,建立一个解决方案或项目DeanUSBKey。在项目类型中选择Visual C++下的ATL选项,在模板中选择”ATL Project”,项目名为DeanUSBKey。点击确定,系统就在指定的目录下建立了DeanUSBKey项目和解决方案。

点击确定后,会出现建立ATL项目向导对话框,引导用户快捷方便的建立ATL项目。点击下一步,进入项目属性设置对话框,如图1所示。可以通过该对话框选择是否属性化和发布方式等。

 

图片 1
图1 项目属性设置对话框

具体选项说明如下:

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

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

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

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

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

Support MFC 即支持 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类,本例子中就会用到该类;

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

    我们选择如图1所示的选项,点击完成。ATL Project项目就生成好了,系统会在指定目录下生成一系列文件,ReadMe.txt里有各文件的文件说明。尤其要注意接口定义语言文件(DeanUSBKey.idl),它描述了对象的接口细节。

2、组件

   在COM模型中,客户请求服务时,是通过接口和组件进行交互的。现在还是一个空的ATL项目,还没有任何组件。

添加组件,也就是添加ATL对象类。在DeanUSBKey项目上点击右键,添加类,弹出对话框。在类别中选择ATL。在模板中选择“ATL Simple Object”即ATL简单对象。点击确定,出现建立组件向导。如图2所示,在Short Name输入组件名称USBKey,其它内容系统会自动填写。注意组件名称不能和项目名称重名。点击下一步进入组件选项设置界面。如图3所示

 

图片 2
图2 ATL简单对象组件名字对话框

 

图片 3
图3 ATL简单对象组件选项对话框

具体选项说明如下:

Threading model 即线程模型,COM中的线程,这是一个复杂的部分。我们选"单元"(Apartment),它代表当在线程中调用组件函数的时候,这些调用会排队进行。如果想了解详细细节可以参看《COM技术内幕》一书。

Interface 即接口,双重(Dual),双重接口表示在一个接口中,同时支持自定义接口和 IDispatch 接口。这个非常重要,为了能够使组件能够在脚本中使用,必须选择双重接口选项。因为脚本语言的解释器只认识IDispatch 接口。自定义接口(Custom),直接实现的是IUnknown接口。

Aggregation 即聚合,写的组件,将来是否允许被其他人以聚合方式(有聚合和包容两种方式)使用。Only(只能创建为聚合),有点类似 C++或Java 中的不能直接创建实例的虚类,如果不是处于设计目的,一般这个选项不用。大多数情况下支持“聚合”,所以我们选择“Yes”。

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

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

IObjectWithSite 是否支持IE的调用。

我们选择如图3所示的选项,点击完成。USBKey的组件建立完成。在生成的USBKey.cpp里将是接口IUSBKey的实现。

3、接口方法

在类视图中,IUSBKey接口上点击鼠标右键。在添加项里有添加方法和属性,选择添加方法。打开图4所示的添加接口方法对话框。添加接口方法GetContent,并添加接口方法的参数。[in]表示参数方向是输入;[out]表示参数方向是输出;[out,retval]表示参数方向是输出,同时可以作为函数运算结果的返回值。一个函数中,可以有多个[in]、[out],但[retval]只能有一个,并且要和[out]组合后在最后一个位置。详细的定义说明可以参考IDL的语法说明。

 图片 4

 

图4 添加接口方法对话框

在USBKey.cpp文件里添加函数GetContent的具体实现过程。核心代码如下:

STDMETHODIMP CUSBKey::GetContent(LONG lFlags, BSTR* pUSBContent)

{  

EPAS_STATUS retval;//状态

    EPAS_HANDLE epsHandle ; //EPAS句柄

// 创建设备句柄

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

    if (FT_SUCCESS != retval)  

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

    // 打开设备

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

    if (FT_SUCCESS != retval)

    {return ReturnError(retval);}

    //得到序列号

    unsigned long sn[2] = {0};

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

    if (FT_SUCCESS != retval)  

    {return ReturnError(retval);} 

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

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

    //得到加密字符串

    //1、登录

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

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

    if (FT_SUCCESS != retval){return ReturnError(retval);}

    //2、打开文件

   EPAS_FILEINFO epsFileInfo = {0};

    unsigned long epsFileID = 0x1234;//文件编号

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

    if (FT_SUCCESS != retval){return ReturnError(retval);   }

    //3、读取文件内容

    unsigned long rLen = 0;

    unsigned char rBuff[8*1024] = {0};

    ZeroMemory(rBuff,8*1024);

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

    if (FT_SUCCESS != retval){return ReturnError(retval);}

    //4、关闭文件

retval = epas_CloseFile(epsHandle);

//关闭设备,删除Context

retval = epas_CloseDevice(epsHandle);

retval = epas_DeleteContext(epsHandle);

    strcat_s(m_sn,(char*)rBuff);

本文由澳门皇冠金沙网站发布于网络服务,转载请注明出处:用ATL开发和部署ActiveX网页控件

关键词: