博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cab文件打包的ActiveX控件(转)
阅读量:6952 次
发布时间:2019-06-27

本文共 10735 字,大约阅读时间需要 35 分钟。

hot3.png

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

    利用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数字签名
2009-08-13 15:16

最 近我正在研究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
来自: 

转载于:https://my.oschina.net/amath0312/blog/38465

你可能感兴趣的文章
如何搭建自己的SPRING INITIALIZR server
查看>>
JDK5-注解
查看>>
定义表单控件的id和name注意点
查看>>
UILabel里字体带下划线
查看>>
Ios开发之多线程编程——NSThread
查看>>
linux下网站压力测试工具webbench
查看>>
滑动关闭activity
查看>>
Android Studio撤销与SVN的关联
查看>>
【规范】alibaba编码规范阅读
查看>>
shell中的特殊变量和函数传参
查看>>
使用pdf2htmlEX将pdf文件转为html
查看>>
天鹅会面
查看>>
Python2爬取学生名单
查看>>
Python调用 c++ dll,并且使用Py2exe打包
查看>>
前端MVC的概念了解
查看>>
git在多迭代版本的应用
查看>>
Chrome好用的插件:Wappalyzer 检测网站使用的技术
查看>>
IT兄弟连 JavaWeb教程 经典面试题3
查看>>
CentOS下内核TCP参数优化配置详解
查看>>
Compuer Science - Markdown - Syntax
查看>>