注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

love3400wind的blog

like

 
 
 

日志

 
 
 
 

Delphi 发布ActiveX控件(把ocx做成cab发布)  

2012-12-03 11:32:30|  分类: IT |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

activex数字签名

 

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

 

    但是我的控件必须作数字签名以后,IE才会下载安装。问题是如何给ActiveX控件作数字签名呢?现将具体步骤与大家分享。

 

    首先我需要一套做数字签名的工具。如果你没有,可以到以下地址下载:

 

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

 

    控件的名字是ComActivex.ocx。首先,我们需要创建一个.CAB文件用来把所有需要发布的文件压缩在一起。我们需要一起发布的文件是ComActivex.lic文件。它是Delphi在我们创建控件工程的时候为我们生成的。如果不发布这个文件,你的控件即使下载安装成功,IE也无法显示它。为了在一个.CAB文件中发布多个文件,我们必须先创建一个.INF文件。一个.INF文件可以告诉IE,它需要下载的文件和在哪里可以得到这些文件。

 

1. 创建.INF文件

 

    创建一个.INF文件很简单,用记事本程序编写就可以了。我们把我们的.INF文件取名为ComActivex.inf。因为我们要在.CAB文件中放入ComActivex.ocx和ComActivex.lic这两个文件,所以我们的.INF文件的内容如下:

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

[version]
signature="$CHICAGO$"
AdvancedINF=2.0

[Add.Code]

ComActivex.ocx=ComActivex.ocx

ComActivex.lic=ComActivex.lic //如果创建Active Form时没有选择Make Conctrol Lincensed 则不会产生.lic文件,那么创建.inf文件时可去掉此行

[ComActivex.ocx]
file-win32-x86=thiscab
clsid={25D15D5D-6F18-4BB5-9F1C-9A29BC96CBD3}
FileVersion=1,0,0,0
RegisterServer=yes

[ComActivex.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文件中需要下载的文件,并把这些文件的详细信息映射到其后对应的各个部分。比如[ComActivex.ocx]部分中的信息就是下载ComActivex.ocx这个文件的相关信息。

 

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

 

2. 创建.CAB文件

 

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

 

cabarc.exe -s 6144 N  comm.cab   ComActivex.ocx   ComActivex.inf   ComActivex.lic

# -s 为内置签名预留空间


3. 创建根证书文件root.cer

 

    在命令行输入以下命令:

 

makecert -sv root.pvk -r -n "CN=XPT" root.cer

 #C=CN;S=HuiBei;L=XiangYang;O=XA;OU=DEV;CN=XPT,E=love3400wind@163.com

#这里C是国家和地区代码,S和L都是地区代码,S相当于省或者州这样的级别,L相当于城市级别,O是组织机构名称,OU是次级组织机构名称,CN是主体的通用名(common name).在这里,C,S,L等等属性的类型都是相对固定的,例如C一般就是用来表示国家和地区代码,在DN结构中还可以添加一些其它类型的信息,一般也都是以"xxx=xxx"这样来表示的,E表示email地址

此时需要输入私钥密码,再次需要一至.


4. 将cer证书转换为spc证书:

 

cert2spc root.cer  root.spc

 

5. 创建另外一个自签名证书,用户使用,叫user.cer

 

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

 

makecert -sv user.pvk -r -n "CN=XPT" user.cer

 

cert2spc user.cer user.spc

 

6. 从user.cer创建user.ctl文件

 

makectl user.cer user.ctl

 

7. 用root.pvk和root.spc这两个文件给user.ctl作数字签名

 

signcode -v root.pvk -spc root.spc user.ctl -t http://timestamp.verisign.com/scripts/timstamp.dll

此时需要输入创建root.cer时的私钥密码 


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

 

certmgr -add -ctl user.ctl -s trust

 

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

 

certmgr -add -c root.cer -s root

     

10. 用user.pvk和user.spc给comm.cab作数字签名

 

signcode -v user.pvk -spc user.spc  comm.cab -t http://timestamp.verisign.com/scripts/timstamp.dll

 此时需要输入生成user.cer时的密码


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

 

chktrust comm.cab

 

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

 

    执行以上步骤的过程中,有时候需要用户输入密码。用户可以任意选择一个密码,比如12345。

 

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

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

<HTML>

<H1> 群组配置 </H1><p>

<HR><center><P>

<OBJECT

  id  =comm 

   classid="clsid:25D15D5D-6F18-4BB5-9F1C-9A29BC96CBD3"

   codebase="/OurCAB/comm.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://localhost:8080/adms/services/> <!--value={TMPL,OUTPUT,COND}--> 

>

</OBJECT>

</HTML>

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

 

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

 

    总算完成了。步骤挺繁琐,但是好像必须这么做。我对这个过程中涉及的相关技术并不十分了解,不管怎样,用这些步骤就可以达到目的。如果你发现有什么错误,或者有什么疑问,欢迎留言。如果这篇文章对你有所帮助,目的就达到了。谢谢。

  评论这张
 
阅读(1627)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017