zoukankan      html  css  js  c++  java
  • ActiveX控件打包成Cab实现浏览器自动下载安装

    前言

      我们在浏览器中使用我们自己的一些OCX,或者是DLL这一类的文件,在X86的机器上需要我们手动将这些文件拷贝到Windows/System32 文件夹下面去,然后通过Dos命令regsvr32 test.ocx注册之后才能够使用。
      原来我们一直采用安装包的方式,就是客户端需要安装我们提供的一个exe安装包,这个exe安装包的目的就是将一堆如OCX,DLL之类的文件打包 , 并在客户端安装的时候将这些文件统统拷贝到Windows/System32文件夹下面去, 然后通过Dos命令regsvr32 test.ocx注册文件。但是我们使用这样的方式,会有一个缺陷,就是浏览器端必须要安装我们提供的exe安装包才能使用系统,否则就不能。

    介绍

      微软定义根据微软权威的软件开发指南MSDN(Microsoft Developer Network)的定义,ActiveX插件以前也叫做OLE控件或OCX控件,它是一些软件组件或对象,可以将其插入到WEB网页或其它应用程序中。

      做过ActiveX控件的朋友都知道,使用ActiveX控件,浏览器端就可以自动下载ActiveX控件到Windows/System32,并进行注册。这样我们既不需要手动拷贝文件,又不需要去安装什么exe安装包,还能实现我们想要的功能,这岂不是一举两得。

    准备工作

      要实现ActiveX控件进行自动下载就需要将文件打包成Cab文件,然后浏览器去下载Cab文件,然后解压。

      (1)我们需要准备以下文件:

      用于将ActiveX控件进行打包并加数据鉴名的工具集,如图1:
      makecert.exe 制作cer格式的证书,即X.509证书,同时可以创建私钥和公钥。
      cert2spc.exe  将cer格式证书转换成spc格式证书,即PKCS #7证书。
      cabarc.exe   将ocx打包成cab。
      signcode.exe 将证书签署到ocx上去。
      chktrust.exe  检查签署证书后的ocx是否正确。
      certmgr.exe 是管理证书用的。
      ActvxDoc.exe 用于查看ocx控件的工具

                        (图1)

      (2)用于进行打包用的ocx控件XXXX.ocx。

      (3)用于进行ocx控件注册的XXXX.inf。

      (4)用于ocx文件所引用的文件如:XXXX.dll , XXXX.lic,XXXX.ico等,如图2。

                          (图2)

    步骤

    我们现在开始来制作cab文件啦~~~

    • 我们先把所有的文件放到E:\browseocx 目录下面去,如图3。

                            (图3)

    • 单击“开始”->“运行(R)”-> 输入“cmd” -> 回车 -> 进入到操作的控件所在的目录,如图4所示

                            (图4)

    • 创建PVK文件(私人密匙文件),在命令行中输入“makecert -sk BrowseOcx BrowseOcx.pvk -n CN=XXXXXXXX”,然后回车,如图5所示

                            (图5)

      创建CER文件(公司证书),在命令行中输入“makecert -sk BrowseOcx.pvk BrowseOcx.cer”,然后回车,如图6所示,若出现“Successed”提示,则

      会在E:\browseocx目录下生成BrowseOcx.cer文件,如图7所示

                            (图6)

                            (图7)

    • 创建SPC测试软件出版商证明书,在命令行中输入“cert2spc BrowseOcx.cer BrowseOcx.spc”,然后回车,如图8所示,若出现“Successed”提示,
    • 则会在E:\browseocx目录下生成BrowseOcx. spc文件,如图9所示 
    •                       (图8)

                                            (图9)

    • 创建INF文件,用记录本编辑以下信息
    • [version]   

      signature="$Chicago$"  

      AdvancedINF=2.0  

      [Add.Code]   

      GDIPLUS.DLL=GDIPLUS.DLL

      mfc100.dll=mfc100.dll

      msvcp100.dll=msvcp100.dll

      msvcr100.dll=msvcr100.dll

      acemfcd.dll=acemfcd.dll

      GoldenClient.dll=GoldenClient.dll

      GoldenObjects.dll=GoldenObjects.dll

      piapi32.dll=piapi32.dll

      RtdbBridge.dll=RtdbBridge.dll

      BrowseOcx.ocx=BrowseOcx.ocx

      BrowseOcx.lic=BrowseOcx.lic

      BrowseOCX.ico=BrowseOCX.ico

      [GDIPLUS.DLL]

      file-win32-x86=thiscab

      RegisterServer=yes   

      DestDir=11  

      FileVersion=6,0,3260,0

      [mfc100.dll]   

      file-win32-x86=thiscab

      RegisterServer=yes   

      DestDir=11  

      FileVersion=10,0,40219,1

      [msvcp100.dll]   

      file-win32-x86=thiscab

      RegisterServer=yes   

      DestDir=11  

      FileVersion=10,0,40219,1

      [msvcr100.dll]   

      file-win32-x86=thiscab

      RegisterServer=yes   

      DestDir=11  

      FileVersion=10,0,40219,1

      [acemfcd.dll]   

      file-win32-x86=thiscab

      RegisterServer=yes   

      DestDir=11  

      FileVersion=5,4,1,0

      [GoldenClient.dll]   

      file-win32-x86=thiscab

      RegisterServer=yes   

      DestDir=11  

      FileVersion=1,0,3,11

      [GoldenObjects.dll]   

      file-win32-x86=thiscab

      RegisterServer=yes   

      DestDir=11  

      FileVersion=1,0,3,11

      [piapi32.dll]   

      file-win32-x86=thiscab

      RegisterServer=yes   

      DestDir=11  

      FileVersion=1,6,1,10

      [RtdbBridge.dll]   

      file-win32-x86=thiscab

      RegisterServer=yes   

      DestDir=11  

      FileVersion=1,0,0,0

      [BrowseOcx.ocx]   

      file-win32-x86=thiscab

      clsid={F6157CB2-D9CD-4780-B3BF-C1EF13D48446}   

      RegisterServer=yes 

      DestDir=11  

      FileVersion=2,0,1,0

      [BrowseOcx.lic]

      file-win32-x86=thiscab

      RegisterServer=no

      DestDir=11

      [BrowseOCX.ico]

      file-win32-x86=thiscab

      RegisterServer=no

      DestDir=11

                                  (图10)

                                (图11)

    在BrowseOcx.inf的内容里,[version]和[Add.Code]项是必须的,[Add.Code]的键值项的多少取决于以下你所配制项的多少。

    [mfc100.dll]、[msvcp100.dll]就是上面我所说不是必须的项,只要你想把mfc100.dll、msvcp100.dll包括在发布包里,那这么两项就必

    须写在inf里,而这三项的具体内容是固定的,可复制过去即可。最为关键的就是[BrowseOcx.ocx]项,其中有clsid和FileVersion就

    是BrowseOcx.ocx的classId和version,这要求必须一至,否我们发布出去的CAB包时不能在客户端自动更新下载安装。说到这里,那我们如

    何才能知道BrowseOcx.ocx里面的classId和version呢?我在上面的必备条件里介绍到有一个用于查看ocx控件的工具ActvxDoc,对,就是用

    它,我们双击这个文件运行它,win7下可能不能运行。

    创建CAB文件,在命令行中输入“cabarc -s 6144 n BrowseOcx.cab GDIPLUS.DLL mfc100.dll msvcp100.dll msvcr100.d

    ll acemfcd.dll GoldenClient.dll GoldenObjects.dll piapi32.dll RtdbBridge.dll BrowseOcx.lic BrowseOCX.ico BrowseOc

    x.ocx BrowseOcx.inf”,然后回车,如图12所示:

                          (图12)

    使用Code Signing Wizard签署一个CAB文件,首先双击运行工具集里面的signcode.exe(或在命令行里直接输入“signcode”后回

    车),系统会弹出如图13所示的数字签名向导:

                        (图13)

    单击“下一步(N)”按钮,来到图14所示,选择要进行数字签名的且已做成CAB包的文件BrowseOcx.cab文件。

                      (图14)

    选择好CAB包后单击“下一步(N)”按钮,在选择想要的签名类型里选择“自定议(C)”并单击“下一步(N)”按钮,如

    图15所示。

                      (图15)

    接下来单击“从文件选择(F)”按钮,选择刚刚制作的BrowseOcx.cer,如图16所示:

                    (图16)

    在图16中单击“下一步(N)”按钮来到图17,然后在图17里选择“CSP中的私钥(K)”

                      (图17)

    在图17中单击“下一步(N)”按钮,然后在图18中的散列算法中选择“shal”,并单击“下一步(N)”按钮

                      (图18)

    在“证书路径中的证书”中选择“证书路径中的所有证书,包括根证书(C)”,在“其它证书(可选)”中选择“包括在以

    下PKCS #7 证书(.p7b)文件中的证书(P):”,并单击“浏览(R)…”按钮选择BrowseOcx.spc文件,选择完后

    单击“下一步(N)”按钮,如图19所示:

                    (图19)

    接下来在弹出的“数据描述”窗口中输入公司的名称和网址并单击“下一步(N)”按钮,如图20所示(这的描述,必

    须要和先前第三部制作PVK的描述一致)

                      (图20)

    现大部份工作都已完成,在接下来的一步当中是可选的操作,其作用只是为CAB加入时间戳,此步骤完全可以不做,如

    图21所示:

                    (图21)

    完成

                      (图22)

    这个时候我们已经完成制作cab包

    在服务器上的html中加入OBJECT标签:

    浏览器有的时候可能会禁用掉ActiveX控件,我们需要主动设置浏览器选项。

    注意:打开IE浏览器工具Internet选项安全自定义级别启用所有ActiveX控件

    如:

    <OBJECT id="Chart" codeBase="./Download/CfxIEAx.cab#Version=5,5,3,0" type="application/x-oleobject" heigh

    t="910" width="1870" classid="CLSID:21F49842-BFA9-11d2-A89C-00104B62BDDA" VIEWASTEXT>

      <PARAM NAME="LICENSE" VALUE="./License/CfxIE.lic" />

    </OBJECT>

  • 相关阅读:
    每天一道LeetCode--141.Linked List Cycle(链表环问题)
    每天一道LeetCode--119.Pascal's Triangle II(杨辉三角)
    每天一道LeetCode--118. Pascal's Triangle(杨辉三角)
    CF1277D Let's Play the Words?
    CF1281B Azamon Web Services
    CF1197D Yet Another Subarray Problem
    CF1237D Balanced Playlist
    CF1239A Ivan the Fool and the Probability Theory
    CF1223D Sequence Sorting
    CF1228D Complete Tripartite
  • 原文地址:https://www.cnblogs.com/hexu6788/p/2657279.html
Copyright © 2011-2022 走看看