ActiveX插件如果想在Html中进行引用,必须先对插件ocx文件进行注册,即通过regsvr32将该控件注册到用户的操作系统里。在实际应用中,一般有两种方式来达到这个目的:
一、通过安装程序注册ActiveX
这种方式非常直观,就是制作一个简单的安装程序,该安装程序的任务就是将打包的ocx文件及其依赖文件解压复制到系统目标位置,然后再通过执行regsvr32命令将已复制到用户机器目标位置的ocx文件注册到系统中。当web页面中需要调用相应的ActiveX时,将在显著位置提示用户需下载指定的程序并运行安装。
实际很多应用程序在安装时都隐含地向系统注册了一些ActiveX的,例如QQ、飞信、播放器等,这样相应的web就更加灵活。不过,并不是所有的ActiveX插件都是以ocx文件呈现的,也可以是dll文件。
二、通过cab包由IE自动注册
能否在web页面需要引用ActiveX时由IE自动下载对应的插件并自动安装呢?当然可以。我们要做的就是要将ocx及其他文件打包成一个cab文件,然后将该cab文件放在web服务器上,并在web页面中通过<object ….. codebase=”xxx.cab#version=1,0,0,1” />的方式进行调用。
cab实际上是微软规定的一个特殊格式的压缩文件,制作cab包过程很简单:
1、 准备cabarc.exe工具,该工具可以在这里下载,也可以从微软下载;
2、 将ocx文件及依赖的其他文件放到同一个目录下,并在该目录下创建一个后缀为.inf的文件(文件名可任意取,一般与ocx文件同名,例如MyTestActiveX.inf),文件内容如下:
[version] signature="$CHICAGO$" AdvancedINF=2.0 [Add.Code] MyTestActiveX.ocx=MyTestActiveX.ocxmwhrf_bj.dll = mwhrf_bj.dll [MyTestActiveX.ocx] file=thiscab clsid={1345C26B-E979-45A5-997D-9427FB81E707} FileVersion=1,0,0,1 RegisterServer=yes DestDir=11 [mwhrf_bj.dll] file=thiscabFileVersion=1,0,0,0DestDir=10
a) signature="$CHICAGO$"表示这个.INF文件和Windows95或其后版本和Windows NT 4.0或其后的版本兼容。
b) [Add.Code]下面的内容用于定义该cab需要下载的各文件对应的定义区块,左边为文件名,等号右边为定义区域名,一般为易读均将定义的区域名与文件名相同。
c) 各文件的定义区域分别定义了该文件的各种属性:
file:表示该文件的获取位置,此处thiscab表示该文件就包含在该cab中;如果在其他位置而不在cab包中,则可以写上具体的位置如http://xxx.xxx.xxx/xx/mwhrf_bj.dll
clsid: 只有需要注册的ocx文件才设置这个属性,他的值就是改ocx的唯一classid,可以从项目的.idl文件中最下方查找;
FileVersion:文件版本号。一般将ocx文件的版本号视同为整个cab的版本号,在<object codebase=”xx.cab#version=1,0,0,1”中将用到该版本号。
DestDir:该文件需要COPY到目标机器的位置,11表示system32目录下,10表示windows目录下,……
有关inf文件的具体内容可参考以下文章相关部分,已经非常详细了:
OCX控件CAB打包手册及升级方法
INF文件的语法解说
创建 CAB 文件
VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程
注:如果考虑到终端用户的权限以及将ActiveX注册到什么位置(Current User或Machine),可参考
Non-Admin ActiveX Controls
3、运行如下命令进行打包:
cabarc" -s 6144 N "xxxxxx.cab" "xxxxx.ocx" "mwhrf_bj.dll" "xxxxxx.inf"
其中凡是需要打包的文件均要一一列出,inf文件放在最后(未测试是否必须最后)。文件路径均可以是绝对路径或相对路径,不一定非得是相同文件夹下。
命令执行后将自动生成.cab文件。