MFC ActiveX打包CAB

  1. 准备打包签名工具和要打包的文件

将需要签名和打包的 OCX 、dll和命令放到相同文件夹。

  1. 制作签名证书
    在命令行运行下面命令:
    makecert.exe -ss reader -n “CN=****” -sv reader.pvk -r reader.cer

输入三次,密码,查看控制台出现 Succeeded 表示成功。

此时生成文件:reader.cer和reader.pvk

  1. 运行命令:
    cert2spc.exe reader.cer reader.spc
    查看控制台,出现 Succeeded 表示成功。

此时会生成文件:reader.spc
两条命令结束,我们一共得到三个文件:reader.cer、reader.pvk、reader.spc
3. 对 OCX 进行签名
打包 CAB 之前,首先需要对 OCX 本身进行签名操作,这一步很重要,如果没做,你可能就犯错了。
双击打开signcode.exe

选择签名的ocx

下一步

下一步

下一步

下一步

  1. 编写inf文件
    INF 文件也是一个重点,如果编写错误,则不能正确打包。(各位可以拷贝本人编写的 INF 文件,在此基础上进行修改,保证 INF 文件的正确性)
    如果打包 CAB 没有问题 ocx 、dll 都会下载到 c:/windows/reader/ 目录下,方便各位卸载 ocx ,删除 dll 文件

[version]
signature="CHICAGOCHICAGOCHICAGO"
AdvancedINF=2.0
[DefaultInstall]
CopyFiles=files
RegisterOCXs=RegisterFiles
[DefaultUninstall]
cleanup=1
Delfiles=files
UnRegisterOCXs=RegisterFiles
[SourceDisksNames]
1=%DiskName%,“reader.cab”,1
[SourceDisksFiles]
CardReaderActiveX.ocx=1
BK_Reader_Library.dll=1
IC_Reader_Library.dll=1
ID_Reader_Library.dll=1
dcrf32.dll=1
devcomm.dll=1
iccinterface.dll=1
msvcr100.dll=1
RdCard.dll=1
sdtapi.dll=1
SS728M05_SDK.dll=1
WebP.dll=1
WltRS.dll=1
[RegisterFiles]
%30%\Windows\reader\CardReaderActiveX.ocx
[DestinationDirs]
files=30,Windows\reader
[files]
CardReaderActiveX.ocx=CardReaderActiveX.ocx
BK_Reader_Library.dll=BK_Reader_Library.dll
IC_Reader_Library.dll=IC_Reader_Library.dll
ID_Reader_Library.dll=ID_Reader_Library.dll
dcrf32.dll=dcrf32.dll
devcomm.dll=devcomm.dll
iccinterface.dll=iccinterface.dll
msvcr100.dll=msvcr100.dll
RdCard.dll=RdCard.dll
sdtapi.dll=sdtapi.dll
SS728M05_SDK.dll=SS728M05_SDK.dll
WebP.dll=WebP.dll
WltRS.dll=WltRS.dll
[CardReaderActiveX.ocx]
file-win32-x86=thiscab
clsid={99E3D0E6-CE7E-4424-9599-2AE3DFB32808}
FileVersion=1,0,0,0
RegisterServer=yes
[iBK_Reader_Library.dll]
file=thiscab
FileVersion=1,0,0,1
[IC_Reader_Library.dll]
file=thiscab
FileVersion=1,0,0,1
[ID_Reader_Library.dll]
file=thiscab
FileVersion=1,0,0,1
[dcrf32.dll]
file=thiscab
FileVersion=8,0,1,7
[devcomm.dll]
file=thiscab
FileVersion=1,0,0,1
[iccinterface.dll]
file=thiscab
FileVersion=1,1,0,1
[msvcr100.dll]
file=thiscab
FileVersion=10,0,30319,415
[RdCard.dll]
file=thiscab
FileVersion=2,6,2,0
[sdtapi.dll]
file=thiscab
FileVersion=2,0,2,0
[SS728M05_SDK.dll]
file=thiscab
FileVersion=1,6,0,7
[WebP.dll]
file=thiscab
FileVersion=1,0,0,109
[WltRS.dll]
file=thiscab
FileVersion=1,0,0,1
[Strings]
DiskName=“Windows\reader”

  1. OCX 打包 CAB 文件
    运行命令:
    CABARC.EXE -s 6144 n reader.cab CardReaderActiveX.ocx BK_Reader_Library.dll ID_Reader_Library.dll IC_Reader_Library.dll dcrf32.dll devcomm.dll iccinterface.dll msvcr100.dll RdCard.dll sdtapi.dll SS728M05_SDK.dll WebP.dll WltRS.dll reader.inf
    需要解释一下这条命令:是将 CardReaderActiveX.ocx 、reader.inf、其他dll 文件打包成reader.cab 文件
  2. 对 CAB 文件签名
    对 CAB 文件签名的过程,可以查看上文对 OCX 文件签名的过程,除了第一步此处选择的是 CAB 文件之外。其余步骤完全相同。到目前为止,我们已经将 OCX 打包成 CAB 。
  3. JS 调用 OCX(CAB)
    ① 新建一个 HTML 文件,我们通过如下方式引入 OCX:

② JSP 引入 CAB 文件,codebase需要改为对应的cab所在服务器的路径
classid=“clsid:F6F2B22E-FC89-489F-967B-9676EB269F55”
CODEBASE="${pageContext.request.contextPath}/cab/readcard.cab#version=1,0,0,1"
一项一项解释:
 id=“reader” 表示此 object 对象的 id 为 reader,命名随便都可以,后续会用到。
 classid=“clsid:99E3D0E6-CE7E-4424-9599-2AE3DFB32808” 看到这个,应该很熟悉。classid="clsid:这部分照抄,不要改动。只改动冒号 : 后面部分就行了。
 codebase=“reader.cab#Version=1,0,0,0” 这一部分代码是告诉浏览器,如果找不到 clsid 为 99E3D0E6-CE7E-4424-9599-2AE3DFB32808 注册表,也就是系统中没有注册过此 CardReaderActiveX.ocx ,则去找对应的 reader.cab 文件。这里 “./reader.cab” 意思是和当前 html 存放在同一目录下的 reader.cab 文件。“./”表示当前路径,也就是 html 所在的路径。后面的 “#version=1,0,0,1” 表示当前 OCX 的版本号,也就是 CAB 压缩包中 INF 文件里面写的 OCX 的版本号(FileVersion)。注意版本号:1,0,0,1 是用逗号 “,” 分隔,不是点号 “.” ,如果你用了点号 “.”,那么恭喜你,你又错了。
补充说明:我们遇到过三个版本号

  1. OCX 编写时,C++ 代码中规定了 OCX 的版本号。

  2. OCX 打包 CAB 文件时,INF 文件中规定了当前 OCX 的版本号。

  3. HTML 调用 OCX 时,CODEBASE 表明了需要调用的 OCX 版本号。
    这三个版本号需要一致。
    很有意思的是,如果想要升级 OCX,其实很简单,让 OCX 编写人员升级 OCX,然后我们升级 INF 文件中的版本号,再把相应 HTML 中的版本号也升级。浏览器调用此 HTML 时候,如果发现 CODEBASE 中的版本号升级了,则会自动重新下载 CAB 文件,并重新注册。
    之前,为了测试 OCX 升级后是否本身有问题,手动注册此 OCX ,没有重新打包 CAB,结果每次访问都发现注册的是 CAB 中上一个版本的 OCX。说明只要发现注册过的 OCX 版本和 CAB 版本不一致的情况下,浏览器都会重新下载 CAB,并重新注册。
    这里还要说明一点就是,OCX 被编写出来后。clsid 就固定了。此 OCX 不管注册到哪台电脑上,查看注册表,clsid 都是一样的,不会改变。这也就是为什么我们在 HTML 里面,直接可以写上 clsid 的原因。因为客户下载 CAB ,自动注册后,OCX 的 clsid 就是我们编写 C++ 时候规定的 clsid。
    JS 调用 OCX 方法
    调用每个方法或属性时,最好添加try…catch

  4. 常见错误
     [object Error]、Error:找不到成员
    如果是遇到上面的报错:[object Error] 、Error:找不到成员
    1.首先确定C:\Windows\reader 目录下是否有下载的 OCX 文件,如果该目录下没有任何文件或者没有该目录,则就对照上文,查看是否是 INF 文件编写有问题,或者是 HTML 引入 OCX 对象有错误,导致下载失败。
    2.如果 OCX 文件已下载,则表示虽然 CAB 文件没问题,但 OCX 未注册或者说是注册失败。注册失败的原因,我们首先需要确认是否是缺少 DLL 。如何确认,可以使用上文提到的Dependency Walker软件。如果发现确实是少了 DLL,那我们应该重新打包 CAB,将所缺少的 DLL 文件一起打包到 CAB 中。很多时候,我们通过 CAB 自动注册 OCX ,大多数情况下是不会报任何的错误的。即使是因为缺少 DLL 没有注册成功,也没有任何提示。本人在很多电脑上测试的结果是,只有一台 Win7,出现了缺少 DLL 的报错示,其他所有电脑都没有任何的错误提示。这里特别需要注意:打包 CAB 文件后,请用多台电脑进行测试,最好测试不同的系统,也尽量可以挑选公司非开发人员的电脑。千万别在自己电脑上测试通过,或者某些 OCX 开发者电脑上测试通过后便认为其没有问题。
     对象不支持此属性或方法
    这个错误,在开发的过程中,是必然会遇到的。刚开始,一直以为是调用方式有问题,在尝试了网上能找到的所有其他不同调用方式后发现,并非如此。如果能保证 OCX 的正确性的前提下,此问题的根本原因是因为浏览器对于 OCX 不信任,拦截了 OCX 里面的方法调用。解决此问题的根本办法是修改浏览器设置。
     修改浏览器安全设置
    启用相关的activex选项

MFC ActiveX 打包 CAB相关推荐

  1. VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程

    VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程 开篇语:最近在弄ocx控件发布到asp.net网站上使用,就是用户在使用过程中,自动下载安装ocx控件.(此文章也是 ...

  2. C++ 使用VS2010创建MFC ActiveX工程项目

    1.ActiveX的基本概念 ActiveX控件可以看作是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一起运行.这个容器包括WEB网页,应用程序窗体等... Activ ...

  3. VS2017创建MFC ActiveX工程制作IE OCX插件

    最近看了一个采用MFC ActiveX封装DLL的OCX项目的源码,现将学习到的内容记录下来.本次的学习记录计划写如下几个主题: 1.VS2017创建MFC ActiveX工程制作IE OCX插件 2 ...

  4. MFC(ActiveX编程,孙鑫C++第十八讲笔记整理)

    2019独角兽企业重金招聘Python工程师标准>>> 一:在VB中调用X控件,添加方法 project->Add components.另外可以用Object Browser ...

  5. VS2008 在IE8中 调试 ActiveX控件 无法进入断点的解决方法 设置VS2008和IE8 调试ATL MFC ActiveX控件

    VS2008 在IE8中 调试 ActiveX控件 无法进入断点的解决方法 设置VS2008和IE8 调试ATL MFC ActiveX控件 参考文章: (1)VS2008 在IE8中 调试 Acti ...

  6. OCX打包CAB并签名的过程

    前言 ocx需要依赖dll及ini配置文件,我希望可以自动注册ocx,并将ocx.dll及ini配置文件放入系统文件夹中.所以可以将ocx.dll及ini打包到cab中,当js第一次调用cab时,可以 ...

  7. vs2017开发ActiveX(主讲OCX)(十一)、类向导中MFC ActiveX添加方法、添加函数、添加变量、添加事件、添加属性、添加方法的区别

    本文我们就来说说类向导中MFC ActiveX添加方法.添加函数.添加变量.添加事件.添加属性.添加方法的区别.这个问题曾经困扰过我. 此处是向CCreateOcxDemoApp类中添加成员变量,及成 ...

  8. mfc随记:基于vs2010创建MFC ActiveX控件并测试

    一.新建一个空项目 以管理员打开vs2010,选择新建一个mfc activeX控件,填写项目名称和路径,其他无需修改,直接默认一直下一步即可 二. 添加测试方法 在底部tab栏切换到类视图,右键添加 ...

  9. MFC ActiveX ISafeObject的实现

    转载自:https://blog.csdn.net/jiangtongcn/article/details/13629017 默认情况下,编译的MFC Activex控件,只能在本地代码中运行,即便是 ...

最新文章

  1. ibatis查询SQL语句返回一个对象,此对象包含一个List属性
  2. 洛谷——P2035 iCow
  3. oral_quiz-#求链表中的倒数第K个结点#
  4. [学习笔记]电磁场与电磁波
  5. 51单片机学习笔记(郭天祥版)(9)——IIC、EEPROM
  6. vue如何输出一个值_如何利用vue获取当前点击的元素并传值(图文教程) -
  7. MyCat分布式数据库集群架构工作笔记0007---Mycat登录
  8. 想知道账号被封的感觉么?
  9. 《行为科学统计7e(Statistics for the Behavioral Sciences 10e)》 Introduction to Statistics
  10. 使用ACR122U和Proxmark3复制IC卡
  11. 金橙子打标卡EZCAD软件各种延时说明
  12. 免杀工具BypassAv-web使用教程
  13. Shopee平台很火爆,但是产品价格设置的不合理,努力都是白费的
  14. mac关于 E45: ‘readonly‘ option is set (add ! to override)
  15. Linux学习笔记-exec族函数,system函数,popen函数的用法
  16. 数据分析方法之用户画像分析!
  17. 阿里云安全组开放端口,mysql也设置了登录权限,还是不能远程连接
  18. vue获取上级路由地址
  19. 通过Windows防火墙禁止某程序(或软件)联网
  20. VM虚拟机ssh免密登录其他主机

热门文章

  1. 4G智能音箱技术方案开发
  2. 安卓添加USB外置UVC摄像头
  3. 【Android安全】Android中的应用沙箱和UID | Android多用户
  4. cesium模型加载-加载fbx格式模型
  5. SCI-HUB丨最新文献网址
  6. Ubuntu 16.04 在终端更新adobe flash player
  7. android 向日葵原理,向日葵首发手机控制手机APP
  8. C# 窗口最小化到托盘及右键图标显示菜单
  9. oracle crs 0184,CRS-0184: Cannot communicate with the CRS daemon
  10. gitlab-ce部署