cab文件打包的ActiveX控件

程序环境:Windows Xp SP2, IE 6, Tomcat 6.0, VC++6.0javascript

    利用MFC开发的ActiveX控件要正常运行必须依赖MFC库。可是你不能保证你用户的机器上装有与你开发环境相同的库,因此,当你发行一个ActiveX控件,你必需要包证这些依赖库的存在。

    ActiveX控件作成ocx文件,用于客户端调用本地程序,其中有用到VC中的几个.dll文件。包成cab文件,在服务器端页面进行控件调用,下载cab文件并自动注册、使用。
ActiveX控件调用到其余的DLL程序模块,那么IE也必须把这些程序下载到本地来。为此,Microsoft采用了惯用的CAB压缩方法,它把 ActiveX控件应用程序以及相关的其余文件放在同一个CAB文件中,而后在CODEBASE属性中指定CAB文件的URL路径。 当IE找到CODEBASE属性时,它会自动解析URL地址从而把CAB文件解压到客户机的临时目录,而后注册有关文件,调用COM API函数建立ActiveX控件对象。这样就完成了ActiveX控件的传输。

目前制做CAB 文件的软件有主要有Cabarc和WinCAB。
Cabarc是一个用于压缩、列出压缩包中的文件、解压CAB文件的工具。Cabarc支持通配符和递归路径搜索。不过Cabarc使用一个相似于经常使用的压缩工具的命令行界面,而且有较多的参数,与如今主流的Windows操做系统不太协调,使用起来不是很方便。
WinCAB 是一种可视化的全新的CAB压缩包制做软件,它具备采用图形界面、支持分卷压缩、可制做具备自解包功能的CAB压缩包(*.EXE文件格式)等优秀功能, 这就从根本上解决了CAB压缩包的制做问题。须要注意的是在运行WinCAB.exe时,必须确保makecab.exe文件也在相同的目录下。


建立 INF 文件

当用户第一次浏览你控件所在的网页时,它会自动提示控件下载,包括*.inf文本文件中涉及的OCX控件文件以及 DLL文件(控件依赖的MFC库文件,ocx控件也是一种特殊的DLL),并自动注册控件及库文件,而后控件便可以正常使用。控件及库文件只须要下载一 次,当客户端上已有 MFC DLL 时,则不对它们进行下载(默认状况下,版本号同用户硬盘上的现有文件相同的文件不下载)。
INF 文件是一个文本文件,用以指定为控件的运行而须要下载的文件(如 DLL 库文件和 OCX 控件文件)。INF 文件说明都有哪些文件要捆绑在一个压缩的 CAB 文件中。
XMS_Agent.inf文件内容以下:

; Sample INF file for XMS_Agent.OCX
[version]
signature="$CHICAGO$"
AdvancedINF=2.0
[Add.Code]
XMS_Agent.ocx=XMS_Agent.ocx
mfc42.dll=mfc42.dll
msvcrt.dll=msvcrt.dll
olepro32.dll=olepro32.dll
wsock32.dll=wsock32.dll
[XMS_Agent.ocx]
file-win32-x86=thiscab
clsid={997A9783-1815-4820-A2B9-DAB8F0332681}
FileVersion=1.0.0.1
RegisterServer=yes服务器

; needed DLL
[msvcrt.dll]
file-win32-x86=thiscab
FileVersion=7.0.2600.2180     
DestDir=11
RegisterServer=yes
[mfc42.dll]
file-win32-x86=thiscab
FileVersion=6.2.4131.0
DestDir=11
RegisterServer=yes
[olepro32.dll]
file-win32-x86=thiscab
FileVersion=5.1.2600.3266
DestDir=11
RegisterServer=yes
[wsock32.dll]
file-win32-x86=thiscab
FileVersion=5.1.2600.2180
DestDir=11
RegisterServer=yes
; end of INF file

    “thiscab”是一个关键字,表示须要的文件在包含此INF文件的CAB包中。也可经过指定一个相对路径,从一个 HTTP 位置下载所需的 DLL,例如:

    file-win32-x86=http://你的网站地址/NEEDED.DLL

    关键字“file-win32-x86”将平台标识为 x86。

    FileVersion指文件版本号。能够经过在 Windows 资源管理器中的文件上单击鼠标右键来获取文件的版本号。
从显示的列表中选择“属性”,而后在显示的对话框中选择“版本”选项卡。
有时须要在文件版本中额外插入一个 0,例如,在对话框中 ATL.DLL 的版本号若是显示为 2.00.7026。而在 INF 文件中,须要变为 2, 00, 0, 7026。

    控件的文件版本能够经过 Visual Studio 的版本资源得到。
从文件菜单中,选择打开,而后单击打开为(Open as): 资源,打开控件OCX文件;所需的文件版本就在 FILEVERSION 后面列出。

    “DestDir”是文件要下载到的目录位置:11 指定系统目录 WINDOWS/SYSTEM 或 WINNT/SYSTEM32;
10 指定 Windows或WINNT目录。
若是未指定任何 DestDir(典型状况),则代码安装在固定的 OCCACHE临时目录中。 
“clsid”是将要安装的控件的 CLSID。

下边是个在网上发布控件,在微软网站下载mfc42.cab的例子:

[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文件中能够找到
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


打包文件

  • 使用Cabarc:
    下载 Cabinet 软件开发工具包(也称为 Cabinet SDK 或 CAB 开发工具包),解压缩后能够找到构造 CAB (.cab) 文件所需的工具CABARC.EXE文件。
    Cabinet 软件包下载地址请参见如下 Microsoft 网站:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncabsdk/html/cabdl.asp

    把控件文件、库文件(vc6.0MFC库文件包括mfc42.dll、msvcrt.dll、olepro32.dll、wsock32.dll)、打包 命令文件CABARC.EXE,以及控制 ActiveX 控件安装的 .inf 文件放在同一目录下,运行如下DOS命令打包控件:

cabarc.exe -s 6144 N XMS_Agent.cab XMS_Agent.ocx XMS_Agent.inf mfc42.dll msvcrt.dll olepro32.dll wsock32.dll

  • 使用WinCAB:(其中注意Makecab.exe要在WinCAB目录下)
    启动WinCAB,而后执行“Cabinet”菜单的“New”命令或单击快捷工具栏上的“New cabinet”按钮,准备制做新的CAB压缩包。
    单击快捷工具栏上的“Add file(s) to cabinet”按钮,打开“Add file(s) to cabinet”对话框。
    选择欲添加到CAB压缩包中的文件后单击“打开”按钮,将它们添加到WinCAB的文件列表中。这里只须要添加YourCtl.ocx和YourCtl.inf以及所需dll文件。
    在WinCAB快捷工具栏的“Cabinet path and name”框中输入或利用“Browse for path and name”按钮指定CAB压缩包的路径及文件名。
    在“Cabinet size”栏中指定CAB压缩包的尺寸。
    在“Compression method”框中选择合适的压缩方式。
    单击“Save cabinet”按钮,WinCAB即会按照用户的要求进行压缩。
    压缩完成后,WinCAB会给出一个“WinCAB Report”的报告框,向广大用户报告有关文件个数、压缩先后的文件尺寸、压缩率、压缩时间等状况。至此,一个CAB文件就生成了。
  • 使用\WINDOWS\system32\iexpress.exe:(在网上看见的,没用过)
    选择“Create new Self Extraction Directive file”,点击下一步。
    选择“Create compressed files only(ActiveX Installs)”,点击下一步。
    点击Add,文件添加(XMS_Agent.ocx、XMS_Agent.inf、mfc42.dll、msvcrt.dll、olepro32.dll、wsock32.dll),点击下一步。
    点击Browse,输入.CAB文件的存放地址(包含所取文件名),这里取XMS_Agent.CAB,而且要选中 “Store files using Long File Name inside Package”。点击下一步。
    选择“Don’t save”,一直点击下一步,直到完成。

因为CAB的压缩率比咱们经常使用的ARJ、ZIP、RAR等压缩包要高许多(约20%),从而进一步的减小了压缩文件所占用的磁盘空间,当采用该技术在Internet上传输ActiveX控件时既减小了网络流量,也加快了网页打开的速度。
另外,因为CAB压缩包具备“只读”属性,在建立完成后即不容许再做任何修改、删除,所以不易受到病毒、误操做等问题的影响,安全性也具备保证,实为广大用户在Windows 下进行文件的压缩、备份工做时的最佳选择。
注:**基金项目**,国家973计划,(编号:G1998030600)。


关于证书和签名

这部分没涉及到……,也不知道真正的用意,下边是抄袭过来的,有待之后的理解。

传说中数字签名以后就能够不出现提示而自动下载:
\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin下有关于证书和签名相关工具

Makecert.exe ---证书建立工具
Cert2Spc.exe ---发行者证书测试工具
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,再下一步完成。

这样就对CAB文件进行了签名,可是这个时候点击这个文件会发现证书不可用,缘由是证书没有安转。文件属性->数字证书->详细信息-〉查看证书-〉安装证书,进入安装证书向导,存放区域选择“受信任的根证书颁发机构”,点击完成便可。


建立包含控件的网页

贴入测试页面代码:

<HTML>
<HEAD>
<TITLE>socket_ocx</TITLE>

<script type="text/javascript">
OpenSocket();
</script>

</HEAD>
<BODY >

<!-- 事件 -->
<script language="javascript" event="etEventCallin(recvstr,mainId)" for="KeygoeOcx">

if(RecvText.innerText=="")
{
RecvText.innerText="Event:<etEventCallin> "+"来电号码:<"recvstr+"> "+"MainID:<"+mainId+">";
}
else
{
RecvText.innerText=RecvText.innerText+"\n"+"Event:<etEventCallin> "+"来电号码:<"recvstr+"> "+"MainID:<"+mainId+">";
}

</script>

<!-- 方法 -->
<script language="javascript">

var strIP = "192.168.1.19"; // SOCKET服务端IP地址
var nWorkID = 101;    // 工号

// 打开Socket链接
function OpenSocket(){
KeygoeOcx.etOpenEx(strIP);
}
// 关闭Socket链接
function CloseSocket(){
KeygoeOcx.etClose();
}
// 签入
function Login(){
KeygoeOcx.etLogin(nWorkID);
}

// 签出
function Logout(){
KeygoeOcx.etLogout();
}

</script>

<!-- 加载 -->
<OBJECT width="0" height="0" ID="KeygoeOcx" WIDTH=100 HEIGHT=51
codebase="http://192.168.1.19:8080/XMS_Agent.cab#Version=1,0,0,1"
CLASSID="CLSID:997A9783-1815-4820-A2B9-DAB8F0332681">
<PARAM NAME="_Version" VALUE="65536">
<PARAM NAME="_ExtentX" VALUE="2646">
<PARAM NAME="_ExtentY" VALUE="1323">
<PARAM NAME="_StockProps" VALUE="0">
</OBJECT>

<!-- 界面 -->
接收内容:<br>
<textarea id=RecvText cols=50 rows=5 ></textarea>
<br>
<button id="btnOpenSocket" οnclick="OpenSocket()">打开Socket链接</button>
<button id="btnCloseSocket" οnclick="CloseSocket()">关闭Socket链接</button>
<br>
<button id="btnOpenSocket" οnclick="Login()">签入</button>
<button id="btnOpenSocket" οnclick="Logout()">签出</button>
<br>

</BODY>
</HTML>

注:若是本机使用能够codebase="http://localhost/testactivex/XMS_Agent.cab#Version=1,0,0,001"
testactivex为在本地机建立的虚拟目录。
发布XMS_Agent.cab文件,把cab文件放在Tomcat的Webapps\ROOT\下仍是Tomcat\webapps下该调用所在的工程下??启动Tomcat。


测试控件下载和运行

应该在Internet选项-〉安全-〉受信任的站点-〉站点 中添加服务器地址。注意:不要选复选框“对该区域中的全部站点要求服务器验证”。
等待对方答复是否好使中....


二:

发布ActiveX控件(把ocx作成cab发布) --activex数字签名

最 近我正在研究ActiveX技术。我使用Delphi 7建立了一个具备ActiveForm的ActiveX控件应用程序。这个控件产生一个.OCX文件。如今,我须要把这个控件部署在服务器端,在用户浏览 网页并选择安装这个控件的时候,用户的IE才会下载、安装并显示这个控件。

可是个人控件必须做数字签名之后,IE才会下载安装。问题是如何给ActiveX控件做数字签名呢?现将具体步骤与你们分享。

首先我须要一套作数字签名的工具。若是你没有,能够到如下地址下载:

http://www.cnblogs.com/Files/babyt/SignTool.rar

控件的名字是CustForm.ocx。首先,咱们须要建立一个.CAB文件用来把全部须要发布的文件压缩在一块儿。咱们须要一块儿发布的文件是 CustForm.lic文件。它是Delphi在咱们建立控件工程的时候为咱们生成的。若是不发布这个文件,你的控件即便下载安装成功,IE也没法显示 它。为了在一个.CAB文件中发布多个文件,咱们必须先建立一个.INF文件。一个.INF文件能够告诉IE,它须要下载的文件和在哪里能够获得这些文 件。

1. 建立.INF文件

建立一个.INF文件很简单,用记事本程序编写就能够了。咱们把咱们的.INF文件取名为GMTestX.inf。由于咱们要在.CAB文件中放入GMTest.ocx和GMTest.lic这两个文件,因此咱们的.INF文件的内容以下:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[version]
signature="$CHICAGO$"
AdvancedINF=2.0
[Add.Code]
CustForm.ocx=CustForm.ocx
CustForm.lic=CustForm.lic //若是建立Active Form时没有选择Make Conctrol Lincensed 则不会产生.lic文件,那么建立.inf文件时可去掉此行
[CustForm.ocx]
file-win32-x86=thiscab
clsid={C504DF79-C5EC-4314-AC3E-1F770DB81A01}
FileVersion=1,0,0,0
RegisterServer=yes
[CustForm.lic]//若是建立Active Form时没有选择Make Conctrol Lincensed 则不会产生.lic文件,那么建立.inf文件时可去掉此行
file-win32-x86=thiscab//若是建立Active Form时没有选择Make Conctrol Lincensed 则不会产生.lic文件,那么建立.inf文件时可去掉此行
FileVersion=1,0,0,0//若是建立Active Form时没有选择Make Conctrol Lincensed 则不会产生.lic文件,那么建立.inf文件时可去掉此行

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在这个.INF文件的[version]部分有两句代码。signature="$CHICAGO$"表示这个.INF文件和Windows95或其后版 本和Windows NT 4.0或其后的版本兼容。AdvancedINF=2.0表示Advpack.dll的版本,IE 4.0或其后版本必须导入这个文件去解析这个.INF文件。在这里要求的版本是2.0。

至于[Add.Code]部分,其中列出了在一个.CAB文件中须要下载的文件,并把这些文件的详细信息映射到其后对应的各个部分。好比[CustForm.ocx]部分中的信息就是下载CustForm.ocx这个文件的相关信息。

在[CustForm.ocx]部分的第一句代码告诉IE,CustForm.ocx文件就包含在这个.CAB文件中。第二行注明了这个控件的CLSID 号。第三行是控件的版本号。第四行告诉IE须要使用前面的CLSID号来注册这个控件。[CustForm.lic]部分就很少讲了。

2. 建立.CAB文件

在命令行中输入如下代码把CustForm.ocx、CustForm.inf和CustForm.lic这三个文件添加到一个.CAB文件中,这个文件取名为CustForm.cab:

cabarc.exe -s 6144 N CustForm.cab CustForm.ocx CustForm.inf CustForm.lic

3. 建立证书文件

在命令行输入如下命令:

makecert -sv CustForm.pvk -r -n "CN=SunStar" CustForm.cer

4. 转换证书:

cert2spc CustForm.cer CustForm.spc

5. 建立另一个自签名证书,叫test.cer

在命令行中依次输入如下两条命令:

makecert -sv test.pvk -r -n "CN=SunStar" test.cer

cert2spc test.cer test.spc

6. 从test.cer建立test.ctl文件

makectl test.cer test.ctl

7. 用CustForm.pvk和CustForm.spc这两个文件给test.ctl做数字签名

signcode -v CustForm.pvk -spc CustForm.spc test.ctl

8. 把test.ctl移动到受信系统存储区

certmgr -add -ctl test.ctl -s trust

9. 把CustForm.cer移动到根系统存储区

certmgr -add -c GMTestX.cer -s root

10. 用test.pvk和test.spc给CustForm.cab做数字签名

singcode -v test.pvk -spc test.spc CustForm.cab

11. 检查文件是否经过验证

chktrust CustForm.cab

若是文件经过了数字签名检测,系统会询问是否安装这个文件,这时候必定要选择安装,整个签名过程才能完成。

执行以上步骤的过程当中,有时候须要用户输入密码。用户能够任意选择一个密码,好比12345。

接下来,咱们把一个调用Delphi的Web Deploy命令产生的文件CustForm.htm复制到C:\Inetpub\wwwroot\OurHTML文件夹中,并修改其内容以下:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<HTML>
<H1> 群组配置 </H1><p>
<HR><center><P>
<OBJECT
id =CustForm 
classid="clsid:7E302B32-912F-427B-98D0-03AB15716E81"
codebase="/OurCAB/CustFormX.cab#version=1,0,0,0"
width=100%
height=80%
align=center
hspace=0
vspace=0

<param   name=Invaild         value=Invaild> 
<param   name=wsroot          value=http://192.168.0.56:8080/adms/services/> <!--value={TMPL,OUTPUT,COND}--> 
>
</OBJECT>
</HTML>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
再将签名的CustForm.cab文件移动到C:\Inetpub\wwwroot\OurCAB文件夹中。

好了,如今打开IE,在地址栏中输入:http://localhost/OurHTML/CustForm.htm后,IE询问是否下载这个控件,咱们选择是,就能够看到咱们的ActiveX控件的窗体了。大功告成!


三:将下面语句包含在build.bat中
makecab HqForm.ocx ocx\HqForm.cab

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值