如何安装activex控件officecab dwzfkey.cab

4807人阅读
&[Delphi] 发布ActiveX控件(把ocx做成cab发布) ***********转贴**********& 作者:光明兄弟
activex数字签名 &
&&& 最近我正在研究ActiveX技术。我使用Delphi 7创建了一个具有ActiveForm的ActiveX控件应用程序。这个控件产生一个.OCX文件。现在,我需要把这个控件部署在服务器端,在用户浏览网页并选择安装这个控件的时候,用户的IE才会下载、安装并显示这个控件。&&&& 但是我的控件必须作数字签名以后,IE才会下载安装。问题是如何给ActiveX控件作数字签名呢?现将具体步骤与大家分享。&&&& 首先我需要一套做数字签名的工具。如果你没有,可以到以下地址下载:&&&& &&&& 控件的名字是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,在地址栏中输入:后,IE询问是否下载这个控件,我们选择是,就可以看到我们的ActiveX控件的窗体了。大功告成!&&&& 总算完成了。步骤挺繁琐,但是好像必须这么做。我们对这个过程中涉及的相关技术并不十分了解。察看MSDN文档可以找到很多资料,想全部搞清楚得费点劲。不管怎样,用这些步骤就可以达到目的。如果你发现有什么错误,或者有什么疑问,欢迎留言。如果这篇文章对你有所帮助,目的就达到了。谢谢。&&& && 盗版 光明兄弟 的文章,结合自己练习的过程写的&&&&
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:179910次
积分:2570
积分:2570
排名:第7460名
原创:73篇
转载:31篇
评论:53条
(2)(2)(1)(1)(1)(3)(1)(1)(6)(3)(1)(4)(3)(3)(3)(2)(7)(1)(8)(4)(5)(5)(16)(5)(1)(3)(1)(2)(1)(1)(1)(5)(1)当前访客身份:游客 [
这个人很懒,啥也没写
:引用来自“要化茧的小虫”的评论楼主,我用的cen...
:楼主,我用的centos6.5 64位,按照你的方法装无线...
:引用来自“宗耀”的评论 亲,如果数据库里面有数...
:亲,如果数据库里面有数据的话,这样修改的话会不...
今日访问:2
昨日访问:8
本周访问:2
本月访问:249
所有访问:11122
cab文件打包的ActiveX控件(转)
发表于4年前( 20:50)&&
阅读(4867)&|&评论()
0人收藏此文章,
程序环境: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={997A20-A2B9-DAB8F0332681} FileVersion=1.0.0.1 RegisterServer=yes
; needed DLL [msvcrt.dll] file-win32-x86=thiscab FileVersion=7.0.&&&&& 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. DestDir=11 RegisterServer=yes [wsock32.dll] file-win32-x86=thiscab FileVersion=5.1. 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=/controls/vc/mfc42.cab run= % EXTRACT_DIR % \mfc42.exe
使用Cabarc: 下载 Cabinet 软件开发工具包(也称为 Cabinet SDK 或 CAB 开发工具包),解压缩后可以找到构造 CAB (.cab) 文件所需的工具CABARC.EXE文件。 Cabinet 软件包下载地址请参见以下 Microsoft 网站:
&&& 把控件文件、库文件(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计划,(编号:G)。
关于证书和签名
这部分没涉及到……,也不知道真正的用意,下边是抄袭过来的,有待以后的理解。
传说中数字签名之后就可以不出现提示而自动下载: \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: ///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 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(); }
&!-- 加载 --& &OBJECT width=&0& height=&0& ID=&KeygoeOcx& WIDTH=100 HEIGHT=51 codebase=&& CLASSID=&CLSID:997A20-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=&& 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控件作数字签名呢?现将具体步骤与大家分享。
首先我需要一套做数字签名的工具。如果你没有,可以到以下地址下载:
控件的名字是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,在地址栏中输入:后,IE询问是否下载这个控件,我们选择是,就可以看到我们的ActiveX控件的窗体了。大功告成!
三:将下面语句包含在build.bat中 makecab HqForm.ocx ocx\HqForm.cab
更多开发者职位上
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读西西软件下载最安全的下载网站、值得信赖的软件下载站!
您的位置:
→ 使用C#开发ActiveX控件 控件开发、制作CAB包、签名、部署
ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力。通常ActiveX控件都是用C++或VB语言开发,本文介绍另一种方式,在.NET Framework平台上,使用C#语言开发ActiveX控件。虽然本文通篇都在讲如何使用C#语言开发ActiveX控件,但我并不极力推荐使用这种技术,因为该技术存在明显的局限,即需要浏览器端安装.NET Framework(版本取决于开发ActiveX控件使用的.NET Framework版本),该局限对于挑剔的互联网用户,几乎是不可接受的。所以,我建议以下几条均满足时,方可考虑使用该技术:开发团队中没有人掌握使用C++/VB开发ActiveX控件技术;该ActiveX控件不用于互联网;用户对仅能使用IE浏览器访问表示可以接受;用户对在浏览器端安装.NET Framework组件表示可以接受。另外,我建议如果不是因为控件的依赖库基于更高版本的.NET Framework,或需要更高版本的.NET Framework提供的扩展功能(如需要WCF等),尽量在.NET Framework 2.0上开发ActiveX控件,因为.NET Framework 2.0只有20M,相比300M的.NET Framework 3.5和40M的.NET Framework 4.0都要小很多,对客户端操作系统的要求也要低很多,并且随着Windows版本的不断升级换代,Windows Vista以后的版本已经内置了.NET Framework 2.0。等到Windows XP系统寿终正寝之时,也将迎来该技术的春天。所以,别被我上面的建议夯退了,掌握该技术其实还是蛮有实用价值的,毕竟,C#高效的开发效率很有吸引力。本文接下来将使用C#语言开发一个ActiveX控件,实现对浏览器端的MAC地址遍历功能;另外,提供一个在Web静态页面中调用该控件的测试实例。本实例的开发环境为Visual Studio 2010旗舰版(SP1),目标框架为.NET Framework 2.0;浏览器端测试环境为Windows 7旗舰版,IE8。控件开发使用C#进行ActiveX控件开发过程其实很简单。首先,在解决方案中添加一个类库项目,目标框架使用.NET Framework 2.0,如图1所示:&图1创建ActiveX控件类库此处有一个关键操作,需要设置类库项目属性-&程序集信息-&使程序集COM可见,如图2所示:&图2设置ActiveX控件类库程序集COM可见ActiveX类库的内容大致包括两部分,IObjectSafety接口和实现该接口的控件类。考虑所有控件类都要实现IObjectSafety接口,可以将该接口的实现抽象为一个控件基类。一、IObjectSafety接口为了让ActiveX控件获得客户端的信任,控件类还需要实现一个名为“IObjectSafety”的接口。先创建该接口(注意,不能修改该接口的GUID值),接口内容如下: 1 [ComImport, Guid(&CB5BDC81-93C1-11CF-8F20-4&)]
2 [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
3 public interface IObjectSafety
[PreserveSig]
int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);
[PreserveSig()]
int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);
10 }二、ActiveXControl控件基类 1 public abstract class ActiveXControl : IObjectSafety
#region IObjectSafety 成员
private const string _IID_IDispatch = &{0-}&;
private const string _IID_IDispatchEx = &{a6efd0-c90dcaa9}&;
private const string _IID_IPersistStorage = &{00-}&;
private const string _IID_IPersistStream = &{0-}&;
private const string _IID_IPersistPropertyBag = &{37D84F60-42CB-11CE-4BB851}&;
private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x;
private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x;
private const int S_OK = 0;
private const int E_FAIL = unchecked((int)0x);
private const int E_NOINTERFACE = unchecked((int)0x);
private bool _fSafeForScripting =
private bool _fSafeForInitializing =
public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions)
int Rslt = E_FAIL;
string strGUID = riid.ToString(&B&);
pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
switch (strGUID)
case _IID_IDispatch:
case _IID_IDispatchEx:
Rslt = S_OK;
pdwEnabledOptions = 0;
if (_fSafeForScripting == true)
pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
case _IID_IPersistStorage:
case _IID_IPersistStream:
case _IID_IPersistPropertyBag:
Rslt = S_OK;
pdwEnabledOptions = 0;
if (_fSafeForInitializing == true)
pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
Rslt = E_NOINTERFACE;
public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)
int Rslt = E_FAIL;
string strGUID = riid.ToString(&B&);
switch (strGUID)
case _IID_IDispatch:
case _IID_IDispatchEx:
if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) &&
(_fSafeForScripting == true))
Rslt = S_OK;
case _IID_IPersistStorage:
case _IID_IPersistStream:
case _IID_IPersistPropertyBag:
if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) &&
(_fSafeForInitializing == true))
Rslt = S_OK;
Rslt = E_NOINTERFACE;
#endregion
81 }三、MacActiveX控件类 1 [Guid(&65D8E97F-D3E2-462A-B389-241D7C38C518&)]
2 public class MacActiveX : ActiveXControl
public string GetMacAddress()
var mc = new ManagementClass(&Win32_NetworkAdapterConfiguration&);
var mos = mc.GetInstances();
var sb = new StringBuilder();
foreach (ManagementObject mo in mos)
var macAddress = mo[&MacAddress&];
if (macAddress != null)
sb.AppendLine(macAddress.ToString());
return sb.ToString();
20 }注意,第一行指定的Guid值即为该ActiveX控件的唯一标识,请保证其唯一性。Guid的生成有多种方法,你可以在系统目录的Program Files目录搜索一个名为guidgen.exe的工具,用该工具产生;也可以写一段测试代码,调用Guid.NewGuid()方法产生;有的Visual Studio版本也提供了快捷方式,在“工具-&生成GUID”菜单下。另外,访问MAC需要添加对System.Management系统组件的引用。到此,控件类库的开发工作就做完了,整个实现过程确实很简单。发布C#开发的ActiveX控件类库不像OCX那样可以直接通过regsvr32.exe注册(实际上,微软提供了替工具regasm.exe,但由于这种方式要不能实现自动升级,所以本文就不介绍了),要使控件类库运行于浏览器端,可以采取两种方式,一种是将控件类库打包为MSI安装包,然后直接在浏览器端安装;另一种是将MSI再封装为一个CAB包,这个CAB包就是一个ActiveX控件了,可以将它随应用程序一并发布,浏览器端访问包含有该控件的页面时,就会自动提示安装了。接下来就后一种发布方式进行详细讲解。一、安装项目在解决方案中添加一个安装项目,如图3所示:&图3添加安装项目右键点击新添加的安装项目,依次选择“添加-&项目输出”菜单,打开添加项目输出组对话框,并选择ActiveX控件类库“CSharpActiveX”作为主输出,如图4所示:&图4添加项目输出双击安装项目检测到的依赖项“Microsoft .NET Framework”,打开安装项目的启动条件界面,选中“.NET Framework”项,如图5所示:&图5安装项目启动条件按F4快捷键,打开属性窗口,设置.NET Framework项的Version为“.NET Framework 2.0”,如图6所示:&图6设置安装项目的依赖框架下面这步很关键,选中“主输出来自CSharpActiveX(活动)”项,如图7所示:&图7主输出内容项设置主输出项内容的Register属性值为vsdrpCOM,如图8所示:&图8设置主输出项属性二、制作CAB包Visual Studio 2010提供了CAB项目模板,但非常遗憾,无论我怎么设置,其生成的CAB安装包都不能在终端成功安装,最终只能放弃,转而选择了makecab.exe工具。源码提供了该打包工具,位于CAB目录下,共包含makecab.exe、cab.ddf、installer.inf和makecab.bat四个文件,其中cab.ddf和installer.inf文件需要简单说明下。cab.ddf文件定义了CAB文件的打包行为,内容包括打包参数,打包内容项以及输出文件等。需要指出的是,使用C#开发的ActiveX控件CAB包中需要包含MSI文件和installer.inf安装文件两部分。cab.ddf文件内容如下:.OPTION
.Set Cabinet=on
.Set Compress=on
.Set MaxDiskSize=CDROM
.Set ReservePerCabinetSize=6144
.Set DiskDirectoryTemplate=&.&
.Set CompressionType=MSZIP
.Set CompressionLevel=7
.Set CompressionMemory=21
.Set CabinetNameTemplate=&CSharpActiveX.CAB&
&installer.inf&
&CSharpActiveX.msi&installer.inf文件定义了CAB文件的安装行为,作为控件的一部分打入CAB包中,其内容如下:[Setup Hooks]
hook1=hook1
run=msiexec /i %EXTRACT_DIR%\CSharpActiveX.msi /qn
Signature= &$CHICAGO$&
AdvancedInf=2.0makecab.bat文件是调用makecab.exe进行打包的批处理文件,内容如下:makecab.exe
&cab.ddf&当生成安装项目后,将CSharpActiveX.msi文件拷贝到CAB目录下,就可以双击makecab.exe文件进行打包了,执行完成后会输出CSharpActiveX.CAB文件,这就是所谓的ActiveX控件了。三、签名IE采用了AuthentiCode代码签名技术,对浏览器端安装ActiveX控件行为进行了控制。上面生成的ActiveX控件如果想在浏览器端成功安装,需要对浏览器进行设置,具体操作参见部署章节。让所有用户都对IE进行设置,显得不太友好,为此,我们可以考虑使用AuthentiCode技术对ActiveX控件进行签名。Visual Studio 2010附带的signtool.exe(以前版本的VS提供的是另一个工具signcode.exe)代码签名工具可以完成该工作(注意,并非一定要用微软提供的工具进行签名,只要按照AuthentiCode技术标准,使用 PKCS#7标准定义的数据结构生成待签名文件的数字签名,并加入到待签名文件的PE结构中即可)。但需要先准备一个PKCS#12(证书及私钥)文件(.pfx),注意,该证书的增强型密钥用法须包含代码签名这项,如图9所示:&图9代码签名证书本文源码提供了一份测试PKCS#12文件Apollo.pfx,PIN码为。在Visual Studio命令提示(2010)中,进入源码的CAB目录,输入如下命令即可对ActiveX控件进行签名操作了:signtool sign Cf Apollo.pfx Cp
CSharpActiveX.CAB图10对比了签名前后的ActiveX控件文件属性,可以看出,签名后的ActiveX控件属性中已经多了一项数字签名,表示该文件已经过签名。&图10签名前后的ActiveX控件属性对比出于方便考虑,本文源码的CAB目录下提供了一份signtool.exe工具的拷贝,这样就可以将签名命令加入makecab.bat文件中,修改后的makecab.bat我将其命名为makecabsigned.bat,内容如下:makecab.exe
signtool sign -f Apollo.pfx -p
CSharpActiveX.CAB应用ActiveX控件用于HTML静态页面,执行于IE浏览器端。需要以标签的形式引入页面文件,然后使用Javascript语言调用它。测试代码如下: 1
12 注意,标签的classid属性值即为MacActiveX类的Guid特性值。部署ActiveX控件在IE浏览器端的部署会因ActiveX控件是否签名而有所区别。下面就以此分类进行说明。当然,首先需要将test.htm和CSharpActiveX.CAB文件部署到服务器上,假设部署后的访问地址为http://192.168.1.1/test.htm。一、部署未签名的ActiveX控件未签名的ActiveX控件不受浏览器端信任,默认是不被允许安装的。需要先将站点添加为可信站点,具体步骤为:依次打开IE“工具-&Internet选项”,在“安全”选项卡中,选中“可信站点”,如图11所示:&图11&Internet安全选项点击“站点”按钮,打开可信站点管理对话框,将服务器站点添加到可信站点列表中,如图12所示:&图12可信站点对话框回到“Internet选项”对话框,点击“自定义级别”选项卡,打开可信站点的安全设置对话框,如图13所示:&图13可信站点安全设置对话框确认“对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本”项设置为“启用”,“下载未签名的ActiveX控件”项设置为“提示”。IE设置完成后,访问http://192.168.1.1/test.htm测试页面(注意,Windows 7需要“以管理员身份运行”IE方可成功安装ActiveX控件),IE便会提示加载ActiveX控件,如图14所示:&图14首次访问提示加载ActiveX控件点击“为此计算机上的所有用户安装此加载项”,IE将弹出安全警告,确认是否要安装该ActiveX控件,如图15所示:&图15&ActiveX控件安装安全警告点击“安装”按钮,确认安装该ActiveX控件,待IE状态栏进度条完成,说明控件已安装完成,可以通过查看“卸载或更改程序”项来确认是否安装成功,如图16所示:&图16确认ActiveX控件成功安装我们可以从ActiveX控件安装过程看出,浏览器端其实是以静默安装的方式完成对CAB包中的MSI安装文件的安装(有点拗口J)。安装完成后,页面成功调用ActiveX控件,弹出接口调用结果(注意Windows 7需要重启IE,且不能用“以管理员身份运行”方式启动,否则会再次提示安装ActiveX控件,但其实控件已经成功安装了,这个问题很奇怪),效果如图17所示:&图17成功调用ActiveX控件接口二、部署已签名的ActiveX控件因为IE默认允许安装并运行收信任的已签名ActiveX控件,所以通过对ActiveX控件签名,可以有效简化浏览器端的配置工作。你仅需要安装签名所用的证书及其证书链文件(本文源码提供的签名文件所含证书是自签名证书,所以它的证书链就只是它自己)。打开源码CAB目录下的Apollo.cer(与Apollo.pfx文件对应的数字证书文件)代码签名证书文件,如图18所示:&图18签名证书文件点击“安装证书”按钮,将该证书安装到“受信任的根证书颁发机构”,如图19所示:&图19安装代码签名证书打开IE的“工具-&Internet选项”对话框,选择“内容”选项卡,点击“证书”按钮,打开IE证书对话框,确认在“受信任的根证书颁发机构”选项卡中包含刚才导入的代码签名证书,如图20所示:&图20成功导入代码签名证书此时,再访问测试页面http://192.168.1.1/test.htm,IE就会提示安装ActiveX控件了,而不再需要将站点添加到可信站点并设置IE选项了。但是,如果用户不能接受初次安装需要导入代码签名证书及其证书链的方式,怎么办呢?从图20可以看到,Windows其实默认内置了一些权威的CA机构证书,可以向这些机构申请一份代码签名证书及私钥文件来对ActiveX控件签名,这样就可以避免该问题了。但是,向权威的CA机构申请证书是需要付费的,所以需要权衡成本和易用性后,再做出选择。升级要使C#编写的ActiveX控件支持自动升级,需要做四件事情,即升级ActiveX控件库版本、升级安装项目版本、设置安装项目注册表项版本和升级网页版本。一、升级ActiveX控件版本打开ActiveX控件项目的“程序集信息”对话框,升级程序集版本和文件版本,如图21所示:&图21升级ActiveX控件版本二、升级安装项目版本选中安装项目,按F4快捷键打开安装项目的属性窗口,升级安装项目的版本,如图22所示:&图22升级安装项目版本注意,此处还有一项关键工作要做,就是设置RemovePreviousVersions属性值为True,这样就会在升级时先自动卸载之前版本的控件。三、设置安装项目注册表项版本浏览器端检测ActiveX控件是否需要升级,是通过比对标签的codebase属性值和本地HKEY_CLASSES_ROOT/CLSID/{GUID}/InstalledVersion键值是否相等来判断的。所以,如果要实现自动更新,需要手动添加该注册表项,并在每次升级控件时,相应更改该项键值。右键点击安装项目,依次选择“视图-&注册表”菜单,打开安装项目的注册表编辑界面,并在HKEY_CLASSES_ROOT节点下,建立CLSID/{GUID}/InstalledVersion注册表键路径,如图23所示:&图23创建注册表键路径右键点击InstalledVersion键节点,选择“新建-&字符串值”菜单,新建一个名称为空(空名称会显示为“(默认值)”),值为当前控件版本号的键值,如图24所示:&图24添加InstalledVersion默认键值该步骤有几个地方需要特别说明。首先,{GUID}指的是ActiveX控件类的GUID,对应本文MacActiveX类指定的GUID,且该项需要包括左右花括号;其次,如果该安装项目用于发布多个ActiveX控件(类),需要创建多个{GUID}/InstalledVersion路径;最后,InstalledVersion的默认键值的主次版本号间是用“,”分隔,而不是“.”,后续升级时,需要同步升级该键值版本号。四、升级网页版本最后,需要升级网页中的ActiveX对象引用版本号,如下用下划线标识部分:重新生成安装程序,打CAB包,将升级的页面及ActiveX控件(CAB包)更新到服务器。此时,浏览器端重新访问时,就会提示/自动升级ActiveX控件了。
阅读本文后您有什么感想? 已有
人给出评价!
访问量多的}

我要回帖

更多关于 如何安装activex控件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信