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) ...
随机推荐
- poj3279 Fliptile
思路: 枚举. 枚举了第一行的操作之后,下面每行的操作也随之确定了.因为在确定了第i行的操作之后,要想再改变a[i][j]的状态只能通过改变a[i + 1][j]来实现.另外,用到了集合的整数表示方法 ...
- css边框样式、边框配色、边框阴影、边框圆角、图片边框
边框样式 点线式边框 破折线式边框 直线式边框 双线式边框 槽线式边框 脊线式边框 内嵌效果的边框 突起效果的边框 <div style="width: 300px; height: ...
- iOS显示一张图片 Objective-C
图片文件放在项目目录下 #import "ViewController.h" @interface ViewController () @end @implementation V ...
- Fiddler——基本常识
web session界面 inspector面板 xml:查看XML数据 json:查看json数据 raw:可以完整查看请求的内容 cookies:可以查看请求的cookie header:查看请 ...
- java虚拟机(九)--常用jvm参数
1.-Xms20M: 表示设置JVM启动内存的最小值为20M,必须以M为单位 2.-Xmx20M: 表示设置JVM启动内存的最大值为20M,必须以M为单位.将-Xmx和-Xms设置为一样可以避免JVM ...
- day02python
''' 列表 定义:在[]内,可以存放多个任意类型的值,并以逗号隔开. 一般用于存放学生的爱好,课堂的周期等等... ''' students=['钱垚','李小龙','张全蛋','赵铁柱'] pri ...
- 【转】Go语言入门教程(一)Linux下安装Go
说明 系统是Ubuntu. 关于安装 下载安装包 当前官方下载地址是https://golang.org/dl/,如果不能访问,请自行FQ,FQ是技术工作者的必备技能. 安装 tar -xzvf go ...
- C# Task详解
1.Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: ◆ ThreadPool不支持线程的取消.完成.失败通知等交互性 ...
- 浮动和margin负值 三列布局
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- css--小白入门篇6(终)
一.相对定位 定位有三种,分别是相对定位.绝对定位.固定定位. 相对定位: 1 position:relative; 绝对定位: 1 position:absolute; 固定定位: 1 positi ...