用ATL开发和部署ActiveX网页控件Word格式文档下载.docx
- 文档编号:3071000
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:8
- 大小:19.38KB
用ATL开发和部署ActiveX网页控件Word格式文档下载.docx
《用ATL开发和部署ActiveX网页控件Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《用ATL开发和部署ActiveX网页控件Word格式文档下载.docx(8页珍藏版)》请在冰点文库上搜索。
但安装的一个前提是必须经过用户的同意及确认。
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选项,在模板中选择&
#8221;
ATL Project&
,项目名为DeanUSBKey。
点击确定,系统就在指定的目录下建立了DeanUSBKey项目和解决方案。
点击确定后,会出现建立ATL项目向导对话框,引导用户快捷方便的建立ATL项目。
点击下一步,进入项目属性设置对话框,如图1所示。
可以通过该对话框选择是否属性化和发布方式等。
图1项目属性设置对话框
具体选项说明如下:
Attributed即属性化,支持属性化编程,是未来的发展方向,是IDL方案的一种替代方案。
Dynamic-linklibrary(DLL)即动态链接库,表示建立一个DLL的组件程序。
Executable(EXE)即可执行文件,表示建立一个EXE的组件程序。
Service(EXE)即服务,表示建立一个系统服务组件程序,系统启动后就会加载并执行的程序。
Allowmergingofproxy/stubcode即允许合并代理/存根代码,选择该项表示把&
#8220;
代理/存根&
代码合并到组件程序中,否则需要单独编译,单独注册代理存根程序。
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(&
amp;
epsHandle,0,EPAS_API_VERSION);
//调用EPAS的API函数访问USBKey硬件
if(FT_SUCCESS!
=retval)
{returnReturnError(retval);
}//返回相应的错误
//打开设备
retval=epas_OpenDevice(epsHandle,lFlags,(void*)szAppID);
=retval)
}
//得到序列号
unsignedlongsn[2]={0};
retval=epas_GetProperty(epsHandle,EPAS_PROP_SERNUM,NULL,sn,sizeof(sn));
}
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);
=retval){returnReturnError(retval);
//2、打开文件
EPAS_FILEINFOepsFileInfo={0};
unsignedlongepsFileID=0x1234;
//文件编号
retval=epas_OpenFile(epsHandle,0,epsFileID,&
epsFileInfo,sizeof(epsFileInfo));
}
//3、读取文件内容
unsignedlongrLen=0;
unsignedcharrBuff[8*1024]={0};
ZeroMemory(rBuff,8*1024);
retval=epas_Read(epsHandle,0,0,rBuff,epsFileInfo.ulFileSize,&
rLen);
//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的接口头文件
comutil.h"
#pragmacomment(lib,"
FT_ND_API.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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ATL 开发 部署 ActiveX 网页 控件