浅析ActiveX控件的CAB压缩(zhuan)

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>


你可能感兴趣的:(Microsoft,IE,C#,vc++,bing)