ActiveX ocx如何在web中打包发布问题 小弟做了个ocx插件,用regsvr32 注册后在本地测试可以运行,但是我想把它打包发布,如何操作?谢谢各位了,多多提建议啊,有用就有分。。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这两天做控件的web发布遇到了几个问题,现总结如下。一、程序描述:程序环境:windows Xp sp2, ie 6, tomcat 5.5, vc++6.0程序过程:控件做成ocx文件,用于客户端调用本地硬件,其中有用到第三方几个.dll文件。采用windows自带iexpress.exe 打包成cab文件,在服务器端jsp页面进行控件调用,下载cab文件并自动注册。二、程序问题:遇到问题:1. cab文件无法下载,而且根本不加提示。2. 下载好的cab文件在system32中能够看到,但是页面仍然不能显示,一把红叉,并且无法使用。问题测试:1. 浏览器页面根本没有下载提示,考虑应该是cab的路径问题,也曾考虑是ie浏览器的安全问题。将安全降到最低测试。反复更改cab路径。2. 这个问题最郁闷,搞了很久。考虑首先是安全问题,然后在网上搜索之后说是sp2调高了安全策略,有说降低安全,有说需要对程序进行数字签名。问题解决:1. 确实是路径不对,与安全无关。当在jsp中代码为:<OBJECT id=pos codebase="TestCAB.CAB#version=1,0,0,1" height=100 width=100 classid="CLSID:719A1D6E-7099-4123-9D63-F0118AFF2D61" VIEWASTEXT></OBJECT>TestCAB.CAB文件应该放置在tomcat5.5安装目录Tomcat 5.5\webapps下该调用jsp所在的工程下。2. 不需要更改安全级别,而应该在Internet选项-〉安全-〉受信任的站点-〉站点 中添加服务器地址。注意:不要选复选框“对该区域中的所有站点要求服务器验证”。三、总结: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 [DefaultInstall] CopyFiles=install.files RegisterOCXs=RegisterFiles [RInstallApplicationFiles] CopyFiles=install.files RegisterOCXs=RegisterFiles [DestinationDirs] install.files=11 [SourceDisksNames] 1=%DiskName%,TestCAB.CAB,1 [Add.Code] pcpos.ocx=pcpos.ocx Comm.dll=comm.dll pcpos.dll=pcpos.dll TCPCLNT.dll=TCPCLNT.dll [install.files] pcpos.ocx=pcpos.ocx Comm.dll=comm.dll pcpos.dll=pcpos.dll TCPCLNT.dll=TCPCLNT.dll [SourceDisksFiles] pcpos.ocx=1 Comm.dll=1 pcpos.dll=1 TCPCLNT.dll=1 [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 [pcpos.dll] file-win32-x86=thiscab RegisterServer=yes DestDir=11 FileVersion=1,0,0,1 [TCPCLNT.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 ---文件签名工具对CAB文件进行数字签名详细讲解教程及工具下载:http://www.cnblogs.com/babyt/articles/118264.htmlhttp://www.cnblogs.com/babyt/articles/118302.htmlhttp://www.cnblogs.com/babyt/articles/118309.html步骤: 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文件进行了签名,但是这个时候点击这个文件会发现证书不可用,原因是证书没有安转。文件属性->数字证书->详细信息-〉查看证书-〉安装证书,进入安装证书向导,存放区域选择“受信任的根证书颁发机构”,点击完成即可。 在客户端测试: 1) 加入证书,浏览器-〉工具-〉Internet选项-〉内容-〉证书-〉受信任的颁发机构-〉导入证书。 2) 在有证书的情况下,如果服务器没有加入“可信任网址”,提示下载的时候会显示证书所签内容,没有证书则提示为“未知”。 3) 如果服务器已加入“可信任网址”,并且已导入证书,则不提示任何信息,在用户毫无感觉情况下下载。如果没有加入“可信任网址“,控件可以正常下载但仍然不能正常使用,与是否签名无关。 四、问题: 1.是否可以不添加“可信任网址”。 2.数字签名的作用,授权证书与不授权证书的区别。 参考资料: http://dev.csdn.net/article/82/82401.shtm http://www.evget.com/article/read_173.aspx http://my.opera.com/joze1981/blog/show.dml/433235源文档 <http://hi.baidu.com/binli33/blog/item/1a0bf6ed556ca14b78f05599.html> 谢谢楼上的兄弟,我现在本地注册了ocx后可以运行我的html:<OBJECT ID="AAAACtiveXXX" WIDTH=500 HEIGHT=500CLASSID="CLSID:BC8B9238-E621-4A84-ADBB-6F92D0B20C62"> codebase="AAAACtiveXXX.ocx" 但是我把ocx反注册后,同样测试,就没办法运行了。这个是什么原因那? 我将我的ocx文件和html放在同一目录ocx名是AAAACtiveXXXhtml内容如下:<HEAD><title>这是简单的OpenGL ActiveX控件的测试页面</title></HEAD><BODY><OBJECT ID="AAAACtiveXXX" WIDTH=500 HEIGHT=500CLASSID="CLSID:BC8B9238-E621-4A84-ADBB-6F92D0B20C62"> codebase="AAAACtiveXXX.ocx" <PARAM NAME="_Version" VALUE="65536"> <PARAM NAME="_ExtentX" VALUE="2646"> <PARAM NAME="_ExtentY" VALUE="1323"> <PARAM NAME="_StockProps" VALUE="0">WIDTH="858"HEIGHT="586">如果你看到这些文字,则你的浏览器不支持此控件的浏览。 <br>如果你安装了WindowsXP sp2, 请在左上角选择盾牌图标允许<br>阻止的内容执行,在连点击两次Yes按钮就可以运行了<br></OBJECT><BR></BODY></HTML>如果我用regsvr32 注册了这个ocx那么用IE打开html的时候是可以看到效果的,但是如果我反注册掉ocx打开就只能看到文字 了。。ocx就不调用了。。这是为什么那?另外我想把ocx和它用到的dll打包成cab,发布到web上,这样在别人的机器上就可以打开刚才那个html了,实现自动下载那个cab,安装到本地,并注册ocx,就可以看到执行的效果了。<OBJECT ID="AAAACtiveXXX" WIDTH=500 HEIGHT=500CLASSID="CLSID:BC8B9238-E621-4A84-ADBB-6F92D0B20C62"> codebase="http://。/cab.cab#version=1.1.1.1" </OBJECT>但是前面那个问题一直很困扰我,不知道怎么解决?有做过,或者遇到类似情况的兄弟没?上来说说 怎么样让它自动注册那?<OBJECT ID="AAAACtiveXXX" WIDTH=500 HEIGHT=500CLASSID="CLSID:BC8B9238-E621-4A84-ADBB-6F92D0B20C62">codebase="AAAACtiveXXX.ocx" 这里不是让他自动下载注册吗?为什么没有效果那? 能帮我看看我的问题吗?我现在测试一个INF安装文件把写好的INF和OCX文件放在一起,然后右键安装INF,但是发现ocx虽然copy到我目的文件夹里面了,但是却没有注册,这个是怎么回事?我的INF是这样写的,能帮我看下嘛有什么问题?AAAACtiveXXX.INF[version] signature="$CHICAGO$"AdvancedINF=2.0[DefaultInstall] CopyFiles=install.filesRegisterOCXs=RegisterFiles[RInstallApplicationFiles]CopyFiles=install.filesRegisterOCXs=RegisterFiles[DestinationDirs]install.files=11[SourceDisksNames] 1=%DiskName%,cab10.cab,1[Add.Code]AAAACtiveXXX.ocx=AAAACtiveXXX.ocx;AAAACtiveXXX.inf=AAAACtiveXXX.inf[install.files]AAAACtiveXXX.ocx=AAAACtiveXXX.ocx[SourceDisksFiles]AAAACtiveXXX.ocx=1[AAAACtiveXXX.ocx]file-win32-x86=thiscab RegisterServer=yes clsid={BC8B9238-E621-4A84-ADBB-6F92D0B20C62} DestDir=11 FileVersion=1,0,0,1;[AAAACtiveXXX.inf];file=this.cab[RegisterFiles] %11%\AAAACtiveXXX.ocx谢谢了 顺便帮我看看我这帖子的问题,谢谢http://topic.csdn.net/u/20100317/13/81760f3d-cc9f-4960-8224-ed947522a9d6.html 居然是自己html写错了。。瀑布汗谢谢慕白兄了 mfc按钮变灰问题 UDP发送的时候出现发送包大小不一样时速度有很大的变化 vc++打印,怎样实现多份打印啊,已经费了我一天的时间啦 回归算法 在线等待~~ 如何快速的查找一个1MB的文本内容的某一个字符是否是汉字? CString 最大支持存储多少个字符 ,我在其中存储了1480个字符是没问题,但要是在多存几个就会出错 大家来讨论一下吧,char * 赋初值的问题 SQLExecDirect问题 NOTIFYICONDATA的结构是什么样的? 哪里有C++ Primer下载?中文最好 如何在VC中控制FLASH翻书效果翻页? 菜鸟问题:这样的表达是类还是构造函数
一、程序描述:
程序环境:windows Xp sp2, ie 6, tomcat 5.5, vc++6.0
程序过程:控件做成ocx文件,用于客户端调用本地硬件,其中有用到第三方几个.dll文件。采用windows自带iexpress.exe 打包成cab文件,在服务器端jsp页面进行控件调用,下载cab文件并自动注册。
二、程序问题:
遇到问题:
1. cab文件无法下载,而且根本不加提示。
2. 下载好的cab文件在system32中能够看到,但是页面仍然不能显示,一把红叉,并且无法使用。
问题测试:
1. 浏览器页面根本没有下载提示,考虑应该是cab的路径问题,也曾考虑是ie浏览器的安全问题。将安全降到最低测试。反复更改cab路径。
2. 这个问题最郁闷,搞了很久。考虑首先是安全问题,然后在网上搜索之后说是sp2调高了安全策略,有说降低安全,有说需要对程序进行数字签名。
问题解决:
1. 确实是路径不对,与安全无关。当在jsp中代码为:
<OBJECT id=pos codebase="TestCAB.CAB#version=1,0,0,1" height=100 width=100 classid="CLSID:719A1D6E-7099-4123-9D63-F0118AFF2D61" VIEWASTEXT></OBJECT>
TestCAB.CAB文件应该放置在tomcat5.5安装目录Tomcat 5.5\webapps下该调用jsp所在的工程下。
2. 不需要更改安全级别,而应该在Internet选项-〉安全-〉受信任的站点-〉站点 中添加服务器地址。注意:不要选复选框“对该区域中的所有站点要求服务器验证”。
三、总结:
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
[DefaultInstall]
CopyFiles=install.files
RegisterOCXs=RegisterFiles
[RInstallApplicationFiles]
CopyFiles=install.files
RegisterOCXs=RegisterFiles
[DestinationDirs]
install.files=11
[SourceDisksNames]
1=%DiskName%,TestCAB.CAB,1
[Add.Code]
pcpos.ocx=pcpos.ocx
Comm.dll=comm.dll
pcpos.dll=pcpos.dll
TCPCLNT.dll=TCPCLNT.dll
[install.files]
pcpos.ocx=pcpos.ocx
Comm.dll=comm.dll
pcpos.dll=pcpos.dll
TCPCLNT.dll=TCPCLNT.dll
[SourceDisksFiles]
pcpos.ocx=1
Comm.dll=1
pcpos.dll=1
TCPCLNT.dll=1
[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
[pcpos.dll]
file-win32-x86=thiscab
RegisterServer=yes
DestDir=11
FileVersion=1,0,0,1
[TCPCLNT.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 ---文件签名工具
对CAB文件进行数字签名详细讲解教程及工具下载:
http://www.cnblogs.com/babyt/articles/118264.html
http://www.cnblogs.com/babyt/articles/118302.html
http://www.cnblogs.com/babyt/articles/118309.html
步骤:
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文件进行了签名,但是这个时候点击这个文件会发现证书不可用,原因是证书没有安转。文件属性->数字证书->详细信息-〉查看证书-〉安装证书,进入安装证书向导,存放区域选择“受信任的根证书颁发机构”,点击完成即可。
在客户端测试:
1) 加入证书,浏览器-〉工具-〉Internet选项-〉内容-〉证书-〉受信任的颁发机构-〉导入证书。
2) 在有证书的情况下,如果服务器没有加入“可信任网址”,提示下载的时候会显示证书所签内容,没有证书则提示为“未知”。
3) 如果服务器已加入“可信任网址”,并且已导入证书,则不提示任何信息,在用户毫无感觉情况下下载。如果没有加入“可信任网址“,控件可以正常下载但仍然不能正常使用,与是否签名无关。
四、问题:
1.是否可以不添加“可信任网址”。
2.数字签名的作用,授权证书与不授权证书的区别。
参考资料:
http://dev.csdn.net/article/82/82401.shtm
http://www.evget.com/article/read_173.aspx
http://my.opera.com/joze1981/blog/show.dml/433235
源文档 <http://hi.baidu.com/binli33/blog/item/1a0bf6ed556ca14b78f05599.html>
我的
html:
<OBJECT ID="AAAACtiveXXX" WIDTH=500 HEIGHT=500
CLASSID="CLSID:BC8B9238-E621-4A84-ADBB-6F92D0B20C62">
codebase="AAAACtiveXXX.ocx" 但是我把ocx反注册后,同样测试,就没办法运行了。这个是什么原因那?
ocx名是AAAACtiveXXX
html内容如下:
<HEAD>
<title>
这是简单的OpenGL ActiveX控件的测试页面
</title>
</HEAD><BODY>
<OBJECT ID="AAAACtiveXXX" WIDTH=500 HEIGHT=500
CLASSID="CLSID:BC8B9238-E621-4A84-ADBB-6F92D0B20C62">
codebase="AAAACtiveXXX.ocx"
<PARAM NAME="_Version" VALUE="65536">
<PARAM NAME="_ExtentX" VALUE="2646">
<PARAM NAME="_ExtentY" VALUE="1323">
<PARAM NAME="_StockProps" VALUE="0">WIDTH="858"
HEIGHT="586">如果你看到这些文字,则你的浏览器不支持此控件的浏览。 <br>
如果你安装了WindowsXP sp2, 请在左上角选择盾牌图标允许<br>
阻止的内容执行,在连点击两次Yes按钮就可以运行了<br>
</OBJECT>
<BR>
</BODY>
</HTML>
如果我用regsvr32 注册了这个ocx那么用IE打开html的时候是可以看到效果的,但是如果我反注册掉ocx打开就只能看到文字 了。。ocx就不调用了。。
这是为什么那?
另外我想把ocx和它用到的dll打包成cab,发布到web上,这样在别人的机器上就可以打开刚才那个html了,实现自动下载那个cab,安装到本地,并注册ocx,就可以看到执行的效果了。<OBJECT ID="AAAACtiveXXX" WIDTH=500 HEIGHT=500
CLASSID="CLSID:BC8B9238-E621-4A84-ADBB-6F92D0B20C62">
codebase="http://。/cab.cab#version=1.1.1.1"
</OBJECT>但是前面那个问题一直很困扰我,不知道怎么解决?有做过,或者遇到类似情况的兄弟没?上来说说
<OBJECT ID="AAAACtiveXXX" WIDTH=500 HEIGHT=500
CLASSID="CLSID:BC8B9238-E621-4A84-ADBB-6F92D0B20C62">
codebase="AAAACtiveXXX.ocx" 这里不是让他自动下载注册吗?
为什么没有效果那?
AAAACtiveXXX.INF[version]
signature="$CHICAGO$"
AdvancedINF=2.0[DefaultInstall]
CopyFiles=install.files
RegisterOCXs=RegisterFiles
[RInstallApplicationFiles]
CopyFiles=install.files
RegisterOCXs=RegisterFiles
[DestinationDirs]
install.files=11
[SourceDisksNames]
1=%DiskName%,cab10.cab,1[Add.Code]
AAAACtiveXXX.ocx=AAAACtiveXXX.ocx
;AAAACtiveXXX.inf=AAAACtiveXXX.inf
[install.files]
AAAACtiveXXX.ocx=AAAACtiveXXX.ocx
[SourceDisksFiles]
AAAACtiveXXX.ocx=1
[AAAACtiveXXX.ocx]
file-win32-x86=thiscab
RegisterServer=yes
clsid={BC8B9238-E621-4A84-ADBB-6F92D0B20C62}
DestDir=11
FileVersion=1,0,0,1;[AAAACtiveXXX.inf]
;file=this.cab[RegisterFiles]
%11%\AAAACtiveXXX.ocx谢谢了 顺便帮我看看我这帖子的问题,谢谢
http://topic.csdn.net/u/20100317/13/81760f3d-cc9f-4960-8224-ed947522a9d6.html
谢谢慕白兄了