cab文件打包的ActiveX控件 activex控件 cab
程序环境: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文件就生成了。
使用WINDOWSsystem32iexpress.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 FilesMicrosoft Visual Studio .NET 2003SDKv1.1Bin下有关于证书和签名相关工具
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" onclick="OpenSocket()">打开Socket连接</button>
<button id="btnCloseSocket" onclick="CloseSocket()">关闭Socket连接</button>
<br>
<button id="btnOpenSocket" onclick="Login()">签入</button>
<button id="btnOpenSocket" onclick="Logout()">签出</button>
<br>
</BODY>
</HTML>
注:如果本机使用可以codebase="http://localhost/testactivex/XMS_Agent.cab#Version=1,0,0,001"
testactivex为在本地机创建的虚拟目录。
发布XMS_Agent.cab文件,把cab文件放在Tomcat的WebappsROOT下还是Tomcatwebapps下该调用所在的工程下??启动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:InetpubwwwrootOurHTML文件夹中,并修改其内容如下:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<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:InetpubwwwrootOurCAB文件夹中。
好了,现在打开IE,在地址栏中输入:http://localhost/OurHTML/CustForm.htm后,IE询问是否下载这个控件,我们选择是,就可以看到我们的ActiveX控件的窗体了。大功告成!
三:将下面语句包含在build.bat中
makecab HqForm.ocx ocxHqForm.cab
来自: http://hi.baidu.com/xzmyzy/blog/item/f964ebdbc73a786cd1164ee5.html
更多阅读
windows7 设置文件夹的权限设置 windows文件夹权限
windows7 设置文件夹的权限设置——简介有些重要的文件,不希望别人删除或者修改。可以给文件夹设置权限,以保护文件,下面介绍一下windows 7系统文件夹权限的设置。步骤如下:windows7 设置文件夹的权限设置——方法/步骤windows7 设置文
win7新建文件夹的快捷键 xp新建文件夹的快捷键
任何的操作系统、软件、游戏,只有熟练使用快捷键,才能最大效率的工作、娱乐,我们不能把所有的时间都浪费在一台机器上,这是不行的。快捷键带给我们的不只是快速,还能感受到机器带来的快感。新建文件夹的快捷键C
QQ安装不了怎么办?提取安装文件失败的解决方案 vs生成解决方案失败
QQ安装不了怎么办?提取安装文件失败的解决方案——简介安装qq时提示“提取安装文件失败”该怎么办?在本篇教程中将为你介绍这个问题的解决方案!安装过程中没有问题,把电脑上原来的版本也卸载了,到最后一步安装新版本,QQ2012的时候却出错
如何更改电脑桌面上文件夹的图标 怎样更改电脑桌面图标
如何更改电脑桌面上文件夹的图标——简介有时候,我们新建一个文件夹,感觉比较单调,想弄的好看一些,换个图标,却不知道该怎么去做,接下来,就告诉大家一个快速的方法。如何更改电脑桌面上文件夹的图标——方法/步骤如何更改电脑桌面上文件夹
怎么更改文件夹的图标(自定义文件夹图标) 自定义文件夹图标
怎么更改文件夹的图标(自定义文件夹图标)——简介打开电脑,我们看到的文件夹都是同一种图标,也许我们会觉得没有美感,没个性!要是能够更改成自己喜欢的图标就好了,那样的话,看起来就爽多了!那么怎么样才能更改成自己喜欢的图标呢?下面小编