OCX 打包 CAB 与 JS 调用具体教程
主要问题是,报错和问题的真正原因没有关系或者说关系不大。甚至非常多时候没有报错。仅仅有不断尝试。
OCX 和 CAB 的关系。
在不注冊的情况下。没办法调用 OCX 。
所以就须要在客户不知情的情况下自己主动对 OCX 注冊。
这也就是 CAB 的作用。
手动注冊 OCX
我们如果。OCX 所在的文件夹是:D:/ocx/xpbutton/xpbutton.ocx
各位能够下载一个工具:Dependency Walker。
OCX 打包 CAB
首先下载 OCX 打包签名工具:ocx 打包签名工具, 訪问password ddb4。
制作签名证书:
makecert.exe -ss xpbutton -n "CN=这里随便" -sv .\xpbutton.pvk -r .\xpbutton.cer
输入三次,password。查看控制台出现 Succeeded 表示成功。
此时生成文件:xpbutton.cert 和 xpbutton.pvk
Cert2Spc.exe .\xpbutton.cer .\xpbutton.spc
此时会生成文件:xpbutton.spc
两条命令结束,我们一共得到三个文件:xpbutton.cer、xpbutton.pvk、xpbutton.spc
对 OCX 进行签名
编写 INF 文件
signature="$CHICAGO$"
AdvancedINF=2.0
[DefaultInstall]
CopyFiles=files
RegisterOCXs=RegisterFiles
[DefaultUninstall]
cleanup=1
Delfiles=files
UnRegisterOCXs=RegisterFiles
[SourceDisksNames]
1 = %DiskName%, "xpbutton.cab", 1
[SourceDisksFiles]
xpbutton.ocx=1
msvcrtd.dll=1
mfc42d.dll=1
mfco42d.dll=1
[RegisterFiles]
%30%\Windows\ocx\xpbutton.ocx
[DestinationDirs]
files=30, Windows\ocx
[files]
xpbutton.ocx=xpbutton.ocx
msvcrtd.dll=msvcrtd.dll
mfc42d.dll=mfc42d.dll
mfco42d.dll=mfco42d.dll
[xpbutton.ocx]
file=thiscab
clsid={134EE1CC-4B8A-4E74-8C41-F4990065E2E1}
FileVersion=1,0,0,1
RegisterServer=yes
[msvcrtd.dll]
file=thiscab
FileVersion=6.0.8337.0
[mfc42d.dll]
file=thiscab
FileVersion=6.0.8168.0
[mcfo42d.dll]
file=thiscab
FileVersion=6.0.8267.0
[Strings]
DiskName="Windows\ocx"
以此类推。
2.
[xpbutton.ocx]
file=thiscab
clsid={134EE1CC-4B8A-4E74-8C41-F4990065E2E1}
FileVersion=1,0,0,1
RegisterServer=yes
进行简单解释:
因为是 64 位系统,本人測试这么写没问题。
OCX 打包 CAB 文件
CABARC.EXE -s 6144 n xpbutton.cab xpbutton.ocx xpbutton.inf
对 CAB 文件签名
对 CAB 文件签名的过程,能够查看上文对 OCX 文件签名的过程,除了第一步此处选择的是 CAB 文件之外。其余步骤全然同样。
非常多教程都到此为止。事实上 OCX 的繁琐远还没有结束。
JS 调用 OCX(CAB)
引入 OCX 控件
仅仅修改冒号 : 后面部分即可了。(本人不小心把 clsid: 这一部分漏掉了,写成了 classid="134EE1CC-4B8A-4E74-8C41-F4990065E2E1",结果 CAB 文件下载不下来)。注意:千万别漏了 clsid。
xpbutton.cab 文件。“./”表示当前路径,也就是 html 所在的路径。
后面的 "#version=1,0,0,1" 表示当前 OCX 的版本。也就是 CAB 压缩包中 INF 文件中面写的 OCX 的版本(FileVersion)。注意版本:1,0,0,1 是用逗号 "," 分隔。不是点号 "." ,假设你用了点号 "."。那么恭喜你,你又错了。
clsid 就固定了。此 OCX 无论注冊到哪台电脑上,查看注冊表。clsid 都是一样的,不会改变。这也就是为什么我们在 HTML 里面,直接能够写上 clsid 的原因。由于客户下载 CAB ,自己主动注冊后,OCX 的 clsid 就是我们编写 C++ 时候规定的 clsid。
JS 调用 OCX 方法
DLL 就可以。
(研究 OCX 留下的后遗症。总认为某些软件会缺少 DLL )
所以。我们必需要在这里 try catch 手动弹出错误信息。但问题事实上也没有那么简单,即使是有报错信息,提示也让人摸不到头脑。
1. [object Error]、Error:找不到成员
,大多数情况下是不会报不论什么的错误的。即使是由于缺少 DLL 没有注冊成功。也没有不论什么提示。本人在非常多电脑上測试的结果是,仅仅有一台 Win7,出现了缺少 DLL 的报错示,其它全部电脑都没有不论什么的错误提示。这里特别须要注意:打包 CAB 文件后,请用多台电脑进行測试,最好測试不同的系统。也尽量能够挑选公司非开发人员的电脑。
千万别在自己电脑上測试通过,或者某些 OCX 开发人员电脑上測试通过后便觉得其没有问题。
解决此问题的根本办法是改动浏览器设置。
至此,OCX 的相关知识已经所有介绍完成,此教程应该能够帮助大家少走一些弯路。这也是近期两个星期的研究成果。
2015.08.26 补充
1.注意:假设使用了 Java 开发,后台使用了 Spring。则应该在 Web.xml 中加入以下的代码。
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.cab</url-pattern>
</servlet-mapping>
上面代码告诉 Spring 不要拦截 *.cab 静态文件。
2.JSP 引入 CAB 文件
<div style="display:none;">
<object id="readcardOCX" width=400 height=100
classid="clsid:F6F2B22E-FC89-489F-967B-9676EB269F55"
CODEBASE= "${pageContext.request.contextPath}/cab/readcard.cab#version=1,0,0,1"
></object>
</div>
在project中引入 CAB 文件,我们须要写
CODEBASE= "${pageContext.request.contextPath}/cab/readcard.cab#version=1,0,0,1"
${pageContext.request.contextPath} 表示project名
cab 文件存放在 webapp/cab 以下
OCX 打包 CAB 与 JS 调用具体教程的更多相关文章
- webpack入门之打包html,css,js,img(一)
webpack到底是什么,网上一大堆介绍的东西,越看越不知道说的什么,所以今天打算自己来记录一下这段时间学习webpack的成果, webpack就是打包文件用的,html,css,js,img,为什 ...
- vs2010开发activex(MFC)控件/ie插件(三),js调用ocx控件的接口函数
原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/50802280 js调用ocx控件的接口函数,先看demo效果: 简单测试过程 ...
- MFC Activex 开发、ocx打包成cab、部署、测试、自动升级
小小抱怨下:也许是MFC现在用的人少的缘故.在国内和国外都基本上找不到什么全的资料.特别是ocx打包成Cab时的安装文件inf的编写方面,国内基本上是copy,抄的还一知半解.查找个资源真心的累啊.现 ...
- JS调用Delphi编写的OCX控件
原文:http://www.mamicode.com/info-detail-471283.html 一.使用Delphi XE2编写OCX控件 生成OCX工程: 1.File-New-Other,在 ...
- 【FLEX教程】#007 如何让JS调用SWF里的方法
HTML中,JS如何调用SWF里面已经封装好的代码呢? 有一些事情Flex没办法实现的,需要通过调用JS来实现. eg: 当浏览器窗体关闭的时候,弹出一个对话框,提示用户是否退出?或者是否保存当前的操 ...
- Phonegap 之 iOS银联在线支付(js调用ios端银联支付控件)
Phonegap项目,做支付的时候,当把网站打包到ios或android端成app后,在app上通过wap调用银联在线存在一个问题: 就是当从银联支付成功后,再从服务器返回到app客户端就很难实现. ...
- FLASH CC 2015 CANVAS (二)html中写JS调用flash中的元件、函数、变量
注意 此贴 为个人边“开荒”边写,所以不保证就是最佳做法,也难免有错误! 正式教程会在后续开始更新 当你导出第一个canvas后,你会在保存fla的文件夹里 (每个项目默认位置)看到 如下文件,(请先 ...
- Xilium.CefGlue利用XHR实现Js调用c#方法
防外链 博客园原文地址在这里http://www.cnblogs.com/shen6041/p/3442499.html 引 Xilium CefGlue是个不错的cef扩展工程,托管地址在这里 ht ...
- PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码
PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码 看看新闻网>看引擎>开源产品 0人收藏此文章, 发表于8小时前(2013-09-06 00:39) ...
随机推荐
- 关于java的print()
print方法是类PrintStream的方法成员,而System类有一个static的PrintStream类型的属性成员,名叫out,我们平时写的System.out.print("he ...
- Android开发: 关于性能需要考虑的
刚做Android开发时,只管完成任务,将需求完成,以能完成一款界面酷炫的app为自豪.然而,随着代码量的增加,越来越意识到,一款成功的移动端产品,光有酷炫的外衣还不够,还需要在各方面都优秀. 试想, ...
- 梦想CAD控件COM接口光栅图处理
在CAD操作过程中,我们在设计绘图时,光栅图像也就是我们常说的图片,应用非常广泛,在CAD中可以直接插入光栅图像,并且可以对光栅图像进行裁剪.透明度调整等一些操作,在网页可以快速实现我们所需功能. 一 ...
- java基础学习之内存分析(栈、堆、方法区)
栈存放:会为每个方法(包括构造函数)开辟一个栈指针,方法执行完毕后,会自动退出,并释放空间,主要每个方法中的存放局部变量 局部变量 先进后出 自下而上存储 方法执行完毕 自动释放空间 堆: 存放n ...
- JavaScript中的方法
JavaScript中的方法 在JavaScript中,可以通过对象来调用对应的方法.在JavaScript中,有三个重要的window对象方法:用于显示警告信息的alert.用于显示确认信息的con ...
- 基于APE物理引擎的管线容积率计算方法
容积率一般应用在房地产开发中,是指用地范围内地上总建筑面积与项目总用地面积的比值,这个参数是衡量建设用地使用强度的一项非常重要的指标.在其他行业,容积率的计算也非常重要,如产品利用率.管道使用率等等. ...
- 【最短路】Dijkstra+ 链式前向星+ 堆优化(优先队列)
Dijkstra+ 链式前向星+ 优先队列 Dijkstra算法 Dijkstra最短路算法,个人理解其本质就是一种广度优先搜索.先将所有点的最短距离Dis[ ]都刷新成∞(涂成黑色),然后从起点 ...
- ssh中将常用的命令做别名
1.vim ~/.bashrc 将光标落到user下面 2. 输入 alias x=‘ssh的命令’ 3.按ESC键,退出输入状态: 4.按:,然后输入wq,保存退出: 5. source ~/.ba ...
- Uva122 Trees on the level
Background Trees are fundamental in many branches of computer science. Current state-of-the art para ...
- C语言编程规范试题
C语言编程规范试题 [说明]: 1.本试题中不考虑头文件引用问题(假定已经包含正确的头文件),C语言的标准函数都可用: 2.如果不特别说明,假定程序运行环境为:操作系统Windows 2000, VC ...