[转]浅析ActiveX控件的CAB压缩

1. 引言
ActiveX控件技术是从OLE基础上发展起来的,是将OLE进行了扩展[kuo zhan]从而使其适应Internet、Intranet、商业应用[ying yong]程序等的开发。当ActiveX控件的程序代码在Internet上传输[chuan shu]时,使用压缩[ya suo]技术传输[chuan shu]程序代码变得非常有意义。
从 另一方面来看,如果ActiveX控件还调用[tiao yong]到其他的DLL程序模块[mo kuai],那么IE也必须把这些程序下载[xia zai]到本地来。为此,Microsoft采用了惯用的 CAB压缩[ya suo]方法[fang fa],它把ActiveX控件应用[ying yong]程序以及相关的其他文件[wen jian]放在同一个CAB文件[wen jian]中,然后在CODEBASE属性[shu xing]中指定CAB文件[wen jian]的URL路径[lu jing]。 当IE找到CODEBASE属性[shu xing]时,它会自动解析URL地址[di zhi]从而把CAB文件[wen jian]解压到客户[ke hu]机的临时目录,然后注册[zhu ce]有关文件[wen jian],调用[tiao yong]COM API函数[han shu]创建ActiveX控件对象[dui xiang]。这样就完成了ActiveX控件的传输[chuan shu]。
  
2. CAB压缩[ya suo]技术简介
微软[wei ruan]公司在发行 Windows 95、Plus!95等软件[ruan jian]时采用了一种全新的CAB压缩[ya suo]包[bao][ya suo bao]形式,它具有压缩[ya suo]率[ya suo lv]高、安全性[an quan xing]好、不易受到破坏等优点,深受广大用户[yong hu]及软件[ruan jian]制作商的欢迎。许多 用户[yong hu]甚至因此希望[xi wang]将自己的数据[shu ju]文件[wen jian]改用CAB压缩[ya suo]包[bao][ya suo bao]的形式加以压缩[ya suo]、备份[bei fen],以尽可能的减少备份[bei fen]文件[wen jian][bei fen wen jian]所占用的磁盘[ci pan]空间[kong jian],并提高它们的安全性[an quan xing]。目前制作CAB 文件[wen jian]的软件[ruan jian]有主要有Cabarc和WinCAB。
Cabarc是一个用于[yong yu]压缩[ya suo]、列出压缩[ya suo]包[bao][ya suo bao]中的文件[wen jian]、解压CAB文件[wen jian]的工具。Cabarc支持[zhi chi]通配符[tong pei fu]和递归路径[lu jing]搜索[sou suo][lu jing sou suo]。不过Cabarc使用一个类似于常用的压缩[ya suo]工具的命令[ming ling]行[ming ling hang]界面[jie mian][ming ling hang jie mian],
并且有较多的参数[can shu],与现在主流的Windows操作系统[xi tong][cao zuo xi tong]不太协调[xie tiao],使用起来不是很方便。
而WinCAB 是一种可视[ke shi]化[ke shi hua]的全新的CAB压缩[ya suo]包[bao][ya suo bao]制作软件[ruan jian],它具有采用图形[tu xing]界面[jie mian]、支持[zhi chi]分卷压缩[ya suo]、可制作具有自解包[bao]功能的CAB压缩[ya suo]包[bao][ya suo bao](*.EXE文件[wen jian]格式)等优秀功能, 这就从根本上解决了CAB压缩[ya suo]包[bao][ya suo bao]的制作问题[wen ti]。需要注意的是在运行[yun hang]WinCAB.exe时,必须确保[que bao]makecab.exe文件[wen jian]也在相同的目录下。
本文就以WinCAB为例来介绍ActiveX控件的CAB文件[wen jian]的制作过程。

3. 将ActiveX控件压缩[ya suo]成CAB文件[wen jian]
主要步骤有:
1)注册[zhu ce]YourCtl.ocx控件。
2)建立YourCtl.inf文件[wen jian]。
   INF文件[wen jian]的格式如下:(在使用Visual C++6.0的情况[qing kuang]下)
   [version]
   signature="$CHICAGO$"
   AdvancedINF=2.0
[Add.Code]
   YourCtl.ocx=YourCtl.ocx
   mfc42.dll=mfc42.dll
   msvcrt.dll=msvcrt.dll
   olepro32.dll=olepro32.dll
[YourCtl.ocx]
   file-win32-x86=thiscab
   clsid={YourCtl.ocx的CLSID} //在YourCtl.odl文件[wen jian]中可以找到
   FileVersion=1,0,0,1
   RegisterServer=yes
[msvcrt.dll]
   FileVersion=6,0,8168,0    
   hook=mfc42installer
[mfc42.dll]
   FileVersion=6,0,8168,0
   hook=mfc42installer
[olepro32.dll]
   FileVersion=5,0,4261,0
   hook=mfc42installer
[mfc42installer]
   file-win32-x86=VALUE=http://activex.microsoft.com/controls/vc/mfc42.cab
   run= % EXTRACT_DIR % \mfc42.exe
  
   这里需要说明[shuo ming]的是上述msvcrt.dll、mfc42.dll、olepro32.dll的FileVersion是根据VC不同的版本而异的,例如在VC5.0sp3中就应该如下
   olepro32.dll   5,0,4230,1
   mfc42.dll     4,21,0,7303
   msvcrt.dll     5,0,0,7303
    每个VC版本都有不同的版本号[ban ben hao],这里只介绍常见的两种。 另外mfc42installer的下载[xia zai]路径[lu jing]除了VC4.1和更早版本使用http://activex.microsoft.com/controls/vc/mfc40.cab外,其他版本都使用http://activex.microsoft.com/controls/vc/mfc42.cab。
3)启动[qi dong]WinCAB开始压缩[ya suo]。(其中注意Makecab.exe要在WinCAB目录下)
   i)启动[qi dong]WinCAB,然后执行[zhi hang]“Cabinet”菜单[cai dan]的“New”命令[ming ling]或单击[dan ji]快捷工具栏上的“New cabinet”按钮,准备制作新的CAB压缩[ya suo]包[bao][ya suo bao]。
ii)单击[dan ji]快捷工具栏上的“Add file(s) to cabinet”按钮,打开“Add file(s) to cabinet”对话框[dui hua kuang]。
iii)选择[xuan ze]欲添加到CAB压缩[ya suo]包[bao][ya suo bao]中的文件[wen jian]后单击[dan ji]“打开”按钮,将它们添加到WinCAB的文件[wen jian]列表[lie biao]中。这里只需要添加YourCtl.ocx和YourCtl.inf两个文件[wen jian]。
iv)在WinCAB快捷工具栏的“Cabinet path and name”框中输入[shu ru]或利用“Browse for path and name”按钮指定CAB压缩[ya suo]包[bao][ya suo bao]的路径[lu jing]及文件[wen jian]名[wen jian ming]。
v)在“Cabinet size”栏中指定CAB压缩[ya suo]包[bao][ya suo bao]的尺寸。
vi)在“Compression method”框中选择[xuan ze]合适的压缩[ya suo]方式。
vii)单击[dan ji]“Save cabinet”按钮,WinCAB即会按照用户[yong hu]的要求进行压缩[ya suo]。
viii)压缩[ya suo]完成后,WinCAB会给出一个“WinCAB Report”的报告框,向广大用户[yong hu]报告有关文件[wen jian]个数、压缩[ya suo]前后的文件[wen jian]尺寸、压缩[ya suo]率[ya suo lv]、压缩[ya suo]时间等情况[qing kuang]。至此,一个CAB文件[wen jian]就生成了。
4. 结束语
由于CAB的压缩[ya suo]率[ya suo lv]比我们常用的ARJ、ZIP、RAR等压缩[ya suo]包[bao][ya suo bao]要高许多(约20%),从而进一步的减少了压缩[ya suo]文件[wen jian]所占用的磁盘[ci pan]空间[kong jian],当采用该技术在Internet上传输[chuan shu]ActiveX控件时既减少了网络[wang luo]流量[liu liang],也加快了网页[wang ye]打开的速度。
另外,由于CAB压缩[ya suo]包[bao][ya suo bao]具有“只读[zhi du]”属性[shu xing],在创建完成后即不允许再作任何修改[xiu gai]、删除[shan chu],因此不易受到病毒[bing du]、误操作等问题[wen ti]的影响,安全性[an quan xing]也具有保证,实为广大用户[yong hu]在Windows 下进行文件[wen jian]的压缩[ya suo]、备份[bei fen]工作时的最佳选择[xuan ze]。
注:**基金项目[xiang mu]**,国家973计划,(编号:G1998030600)。
关于证书[zheng shu]和签名     -|zuiwanting 发表于 2006-5-24 9:58:00

\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin下有关于证书[zheng shu]和签名相关工具
1。Makecert.exe ---证书[zheng shu]创建工具
2。Cert2Spc.exe ---发行者证书[zheng shu]测试工具
3。Signcode.exe ---文件[wen jian]签名工具
建立自己的根证书[zheng shu]:
makecert -sk myPK -ss myName -n "CN=LUO31工作室" -r c:\luo31.cer
      sk-表示主题的密钥[mi yao]容器位置[wei zhi],ss-主题的证书[zheng shu]存储名称, n-证书[zheng shu]颁发对象[dui xiang],r-证书[zheng shu]存储位置[wei zhi];
如果你需要导出私钥[si yao]文件[wen jian],请不要使用sk,而换作s,eg:makecert -ss myName -n "CN=LUO31工作室" -sv c:\luo31.pvk -r c:\luo31.cer
建立自根证书[zheng shu]授权[shou quan]的子证书[zheng shu]:
makecert -sk "myPK" -is myName -n "CN=luo31" -$ commercial -ic c:\luo31.cer c:\31.cer
      sk-表示主题的密钥[mi yao]容器位置[wei zhi],is-颁发者的证书[zheng shu]存储名称, n-证书[zheng shu]颁发对象[dui xiang],ic-颁发者的证书[zheng shu]存储位置[wei zhi],-$-授权[shou quan]范围[fan wei](用于[yong yu]代码签名);
使用Cert2Spc生成spc发行者证书[zheng shu](可选):
cert2spc c:\31.cer c:\31.spc
使用signcode为你的程序,库或cab包[bao]签名:
双 击signcode,或在控制[kong zhi]台[kong zhi tai]键入signcode,不带参数[can shu]会启动[qi dong]签名向导[xiang dao]。在第三步选择[xuan ze]“自定义选项[xuan xiang]”,第四步选择[xuan ze]“从文件[wen jian]选择[xuan ze]”选择[xuan ze]31.spc 或31.cer,第五步选择[xuan ze]“CSP中的私钥[si yao]”,在密钥[mi yao]容器中选择[xuan ze]我们定义的myPK,其他步骤默认[mo ren]即可,如果想添加时间戳[shi jian chuo],请在时间戳[shi jian chuo]服务器[fu wu qi]地址[di zhi]上键 入:(免费时间戳[shi jian chuo]认证[ren zheng])http://timestamp.verisign.com/scripts/timstamp.dll ;
完成后,观察你所签名的文件[wen jian]属性[shu xing][wen jian shu xing],应该已经添加数字[shu zi]签名[shu zi qian ming]项

3. ActiveX控件在页面上的引用[yin yong]

<OBJECT id="axGraphOcxSCADA" style="Z-INDEX: 102; LEFT: 160px; WIDTH: 784px; POSITION: absolute; TOP: 80px; HEIGHT: 536px"
    codeBase="GraphOcx.CAB#version=1,0,0,3" classid="clsid:87186EA1-4D89-4F3E-9D25-1F03F0DDDB95"
    name="axGraphOcxSCADA" VIEWASTEXT>
    <PARAM NAME="_Version" VALUE="65536">
    <PARAM NAME="_ExtentX" VALUE="20743">
    <PARAM NAME="_ExtentY" VALUE="14182">
    <PARAM NAME="_StockProps" VALUE="0">
   </OBJECT>

//////////

从网上找了些相关的资料,最终制作成功,做个小的总结:

首先准备好必须的工具如下:

制作工具:iexpress.exe 和makecab.exe,

签名工具:cert2spc.exe,makecert.exe,signcode.exe

下面我具体说如何使用他们来帮助我们制作需要的cab包。

下面是我引用网上的资料信息.

1. 将ocx文件以及第三方dll文件打包成cab文件:

Internet 软件分发单位是“软件包”,它由包含.INF文件或软件分发.OSD文件(或两者都包括)的.CAB文件所组成。

一个分发单位也可以包含软件组件,

如 ActiveX 控件(.OCX)、.DLL文件、.EXE文件、Java类文件或小程序。当Web页上OBJECT元素的CODEBASE特性引用包含.INF文件的. 

CAB文件时,Internet Explorer将自动把.CAB文件作为软件分发单位下载并安装,每次访问时还会自动检测版本并进行更新。

INF文件是一个文本文件,指定运行控件所需要下载或者呈交的文件(比如.DLL或者其它.OCX)。一个.INF文件就捆绑了.

CAB压缩文件所有的必须文件。 缺省情况下,与现有硬盘中文件版本号相同的文件不被下载。

先自己写了一个inf文件,其中信息包括将.ocx文件,以及相关的.dll文件打包,并下载到文件夹:\WINDOWS\system32,详细标注如下:

[version]    

signature="$CHICAGO$"

AdvancedINF=2.0

[Add.Code]

pcpos.ocx=pcpos.ocx

Comm.dll=comm.dll

[pcpos.ocx]

file-win32-x86=thiscab    

RegisterServer=yes    

clsid={719A1D6E-7099-4123-9D63-F0118AFF2D61}    

DestDir=11    

FileVersion=1,0,0,1

[Comm.dll]

file-win32-x86=thiscab    

RegisterServer=yes                         

DestDir=11    

FileVersion=1,0,0,1

[RegisterFiles]    

%11%\pcpos.ocx

注释:

"thiscab" 是一个关键字,意指包含该INF的CAB文件。也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,如:

file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL

关键字"file-win32-x86" 指定平台是 x86。

文件版本号可见属性。

"DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/ /SYSTEM32;

"clsid" 指的是要安装控件的CLSID。

制作cab:

使用\WINDOWS\system32\iexpress.exe。

1)        选择“Create new Self Extraction Directive file”,点击下一步。

2)        选择“Create compressed files only(ActiveX Installs)”,点击下一步。

3)        点击Add,文件添加(pcpos.ocx,pcpos.dll,comm.dll,tcpclnt.dll),点击下一步。

4)        点击Browse,输入.CAB文件的存放地址(包含所取文件名),这里取TestCAB.CAB,并且要选中 “Store files using Long File Name inside Package”。点击下一步。

5)        选择“Don’t save”,一直点击下一步,直到完成。

注意:

如果控件已经在客户机注册,并且不是通过.CAB的方式注册,那么通过.CAB自动注册的时候,该控件将无法被更新。必须先手动删除该文件。

2. 对CAB文件进行数字签名

传说中数字签名之后就可以不出现提示而自动下载,所以也试试:

在\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin 中间有三个小工具,就用他们来实现数字签名。

1.Makecert.exe ---证书创建工具

2.Cert2Spc.exe ---发行者证书测试工具

3.Signcode.exe ---文件签名工具

步骤:

1)        makecert -ss name -n "CN=公司名" -sv d:\pos.pvk -r d:\pos.cer 其中sk-表示主题的密钥容器位置,

ss-主题的证书存储名称, n-证书颁发对象,r-证书存储位置,-sv 导出私钥文件(为了签名使用)。

注意:这个时候会让输入三次密码,三次要完全一致。

2)        使用Cert2Spc生成spc发行者证书(可选):cert2spc d:\pos.cer c:\pos.spc

3)        双击signcode,不带参数会启动签名向导。先选择要签名文件,下一步,选择“自定义”,

下一步,选择“从文件选择”,添加刚生成的pos.cer证书,下一步,选择刚生成的私钥pos.pvk,再下一步,

可spc证书,再一直下一步。添加时间戳,在时间戳填入http: //timestamp.verisign.com/scripts/timstamp.dll TestCAB.CAB,

再下一步完成。

这样就对CAB文件进行了签名,但是这个时候点击这个文件会发现证书不可用,原因是证书没有安转。

文件属性->数字证书->详细信息-〉查看证书-〉安装证书,进入安装证书向导,存放区域选择“受信任的根证书颁发机构”,点击完成即可。

思想就是如上所示,具体的不懂的可以从网上查相关资料。希望对大家有所帮助。

posted on 2012-04-11 14:15  和轩僮  阅读(462)  评论(0编辑  收藏  举报

导航