最近在做一个 WEB 项目,需要调用 OCX 进行连接读卡器读卡。本来并不想用 OCX 技术,因为 ActiveX 技术是微软出品,这样就导致整个系统只能使用 IE 浏览器(其他浏览器可以通过插件的形式支持 OCX 的调用)。但尝试了很多方法调用客户端 DLL 发现都走不通。最后无奈之下,才打算研究 OCX 技术。
网上都说 ActiveX 技术很麻烦,会出现各种错误,不做的时候不知道,真正需要研究时候,才发现确实如此。主要问题是,报错和问题的真正原因没有关系或者说关系不大,甚至很多时候没有报错,只有不断尝试。
言归正传,下面来讲一下如何搞定 OCX。
首先先声明,本教程只关于 OCX 打包 CAB 和 JS 调用 OCX,这里不探讨如何通过 C++ 写 OCX。因为本人只做 Java 开发,对于C++ 并没有研究。
开发系统:win8.1 64位
测试通过系统:win7 64 位、win8.1 64位、xp 32位
OCX 和 CAB 的关系。
大家知道,得到 OCX 之后,如果想要调用,首先要注册。在不注册的情况下,没办法调用 OCX 。
最简单的注册办法是手动注册。手动注册需要在命令行操作。对于开发人员来说,多多少少要和命令行打交道,可能没有问题,不过对于使用我们系统的客户来说,让他进行命令行操作的确不合适。不管我们文档写得多么详细,对客户来说这都是不友好的,而且手动注册也设计到安全性问题。所以就需要在客户不知情的情况下自动对 OCX 注册。这也就是 CAB 的作用。
输入三次,密码,查看控制台出现 Succeeded 表示成功。
此时生成文件:xpbutton.cert 和 xpbutton.pvk
此时会生成文件:xpbutton.spc
两条命令结束,我们一共得到三个文件:xpbutton.cer、xpbutton.pvk、xpbutton.spc
手动注册 OCX
我们假设,OCX 所在的目录是:D:/ocx/xpbutton/xpbutton.ocx
通过 regsvr32 xpbutton.ocx ,这样我们就手动注册了 OCX。
如果想卸载 OCX,我们可以反注册:regsvr32 /u xpbutton.ocx 。
注册和卸载,我们都需要以管理员身份运行 cmd 控制台。-- 这里特别需要注意!
如果在注册时候出现下面的错误:
1.首先查看是否以管理员身份运行 CMD。
2.如果还是不行,可以考虑将相应的 OCX 放到系统目录下
a). 32 位系统放到 C:\Windows\System32
b). 64 位系统放到 C:\Windows\SysWOW64
3.如果还是报错,那可以确定是缺少 DLL 导致的。各位可以下载一个工具:
Dependency Walker。
这里需要注意的是:首选的是和你系统相同位数的 DLL,肯定不会错,实在找不到 64 位的,才考虑 32 位的版本。
下载了 DLL 后,将 DLL 存放到上面第二步提到的系统文件夹下面,然后再注册。
首先下载 OCX 打包签名工具:
ocx 打包签名工具
, 访问密码 ddb4。
OCX 打包 CAB
将需要签名和打包的 OCX 和命令放到相同文件夹。
制作签名证书:
在命令行运行下面命令:
1. 执行命令:
makecert.exe -ss xpbutton -n "CN=这里随便" -sv .\xpbutton.pvk -r .\xpbutton.cer
此时生成文件:xpbutton.cert 和 xpbutton.pvk
2. 运行命令:
Cert2Spc.exe .\xpbutton.cer .\xpbutton.spc
查看控制台,出现 Succeeded 表示成功。
此时会生成文件:xpbutton.spc
两条命令结束,我们一共得到三个文件:xpbutton.cer、xpbutton.pvk、xpbutton.spc