javascript调用ActiveX接口失败的解决方案及使用心得

前段时间公司做了个比较大的项目,需要用到ocx控件,我厂大部分项目都采用C#.net,而winform程序条用ocx控件接口是相对简单的,但是javascript调用ocx接口,却和winform的用法有些不同,其实真捉摸下,也就能发现:差别不大。

笔者此次主要阐述在项目中用javascript调用ocx控件接口,也就是activeX控件时所遇到的问题及其解决方案。winform用法不在此篇中阐述。

调用activeX插件前,我们要做一些准备工作,我们介绍两种方案:

1.使用regsvr32 命令注册ocx控件,然后用处理web页面文件,我们以html文件为例:在DOM结构中添加如下代码:

<object id="ActiveXClient" classid="CLSID:E85D67B7-B439-46C0-8F7B-18C06774B4B0" style="LEFT: 0px; WIDTH: 100%; TOP: 0px; HEIGHT: 1px">
        <param name="_ExtentX" value="22860">
        <param name="_ExtentY" value="1217">
    </object>

之后便可以使用该对象调用activeX控件的接口,调用方法为:ActiveXClient.function();

可以直接用ID获取该接口对象。

这中方法有个不便:每次打开IE浏览器都会提示:

点击Allow blocked content才能有权限使用控件接口。当然我们可以降低IE的拦截程度,但这不安全。最重要的是:我们不能强求用户每次都去点击这个按钮去使用我们的插件,更不能要求用户去降低他们浏览器的安全性。于是我们有方案二。

2.将ocx控件打包为Cab包,打包方法大家自行搜索,这里不作赘述。最后我们得到一个后缀名为cab的文件。

同样加入一个DOM对象到页面的DOM结构中,但这次有所不同:我们需要加入一个属性:codebase,该属性的值为cab包的路径。例如:

<object id="CtiClient" classid="CLSID:E85D67B7-B439-46C0-8F7B-18C06774B4B0" codebase=http://localhost/DownLoad/MyCab.CAB#version=1,5,7,2 style="LEFT: 0px; WIDTH: 100%; TOP: 0px; HEIGHT: 0px"><param name="_ExtentX" value="22860"><param name="_ExtentY" value="1217"></object>

在打开该页面,IE会直接弹出提示框:是否要安装该插件,选择是。安装完成后,系统会自动帮我们注册ocx控件,并让浏览器自行调用,不再有浏览器权限的烦恼,一劳永逸。

当cab包版本更新时,只要更新文件,并更改代码中cab包的版本号,浏览器便会自动安装最新的cab包,易于维护。

下面笔者描述下在开发过程中遇到的问题:页面提示安装cab包成功,但我开始调接口时,总说我的接口无效或不存在。但IDE能够帮助我取到接口,且接口名和参数都与文档一致,这着实让笔者困扰了很久。

最后发现,加到DOM结构中的DOM对象,其display属性设置为none,即隐藏。大家都知道,虽然隐藏,但该DOM对象是仍然存在的,可activeX插件就是这样规定的,不能将它隐藏,于是我们将display:none移除,接口终于能正常调用了。为了不让它影响该页面的样式,我们可以将它放置在页面顶部或底部,并将它的高度等属性设置为0,这样便可正常调用,且不影响页面布局。

时间: 2024-10-11 10:46:52

javascript调用ActiveX接口失败的解决方案及使用心得的相关文章

微信支付-商户调用支付接口失败,已完成交易接口升级的用户应使用新接口进行交易;

微信支付出现如此问题: 这个是苹果手机会爆出的提示: 安卓手机和苹果手机通过JSAPI支付 JS弹出的res.err_msg:都会出现一下错误: 以上的原因为: 使用扫码登录获取用户信息的openid 不能做为公众平台JSAPI支付的openid : 不保证是唯一原因,但是至少这个会造成以上错误:

PyQt5 中调用MySql接口失败 ( QSqlDatabase 组件) 在Linux环境下如何修改

最近在跑下面这么一个代码,怎么跑都无法连通服务器,如下: # -*- coding: utf-8 -*- ''' [简介] PyQt5中 处理database 例子 ''' import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtSql import QSqlDatabase class ExecDatabaseDemo(QWidget):

JavaScript设计模式之----接口的实现

1.接口 (1)什么是接口? 接口是提供了一种用以说明一个对象应该具有哪些方法的手段.尽管它可以表明这些方法的语义,但它并不规定这些方法应该如何实现.例如,如果一个接口包含有一个名为setName的方法,那么你有理由认为这个方法的实现应该具有一个字符串参数,并且会把这个参数赋给一个name变量.有了这个工具,你就能按对象提供的特性对它们进行分组.例如,即使一批对象彼此存在着极大的差异,只要它们都实现了Comparable接口,那么在object.compare(anotherObject)方法中

WebApi接口 - 如何在应用中调用webapi接口

简单做个webapi(查询+添加)接口 首先,我们需要有一个webapi接口项目,我这里以前面WebApi接口 - 响应输出xml和json文章的项目来构建本篇文章的测试用例:这里新建一个 DbData 数据源类,主要用来做数据存储和提供查询列表数据及添加数据方法,具体代码如:  1 public class DbData 2     { 3         public static DbData Current 4         { 5             get 6         

调用支付宝接口Android客户端没有支付宝APP的情况下解决无法调用支付宝页面的问题

这几天一直研究支付宝接口调用,因为当前应用中需要调用支付宝接口作移动支付. 遇到一个问题困扰几天,就是当我们的手机端未安装支付宝APP的时候,需要在自己应用中调用支付宝的登陆网页进行支付.我是Android开发,网上有很多小伙伴都遇到了无法调起网页支付宝登陆页面的问题,在此给大家分享一个解决方案,希望能帮助遇到同样问题困扰的小伙伴. 网上也有很多贴,都是说要加入H5PayActivity和AuthActivity的配置来解决,但是并不起作用,我的就是,虽然有跳转的动作,但是直接一个白板页面招呼,

浏览器端javascript调用手机终端本地功能实现02-功能点汇总

上篇博文已经说明,本篇直接进入主题.本篇大致说明总体功能以及代码用途,下篇将功能点逐一详细说明. 功能点包括: 拍照相关接口(camera) 功能函数名称 作用 备注 invokeCamera() 调用摄像头拍照 requestAlbum() 调用相册功能 requestAlbumMulti() 相册多选 requestAlbumMultiUpload() 相册多选完后上传 2. 录音相关接口(media) 功能函数名称 作用 备注 startRecord() 录制音频 stopRecord()

浏览器端javascript调用手机终端本地功能实现03-拍照

上篇大致说明了已实现的功能点及大致的实现方式,本篇详细说明如何通过js调用拍照的相关功能. js代码部分已经在<浏览器端javascript调用手机终端本地功能实现02>中展现,主要说明android部分和ios部分的实现.请将js代码或文件放在要加载的服务器页面里. android端实现 1 //定义拍照相关接口 2 private JSInterfaceCamera jsInterfaceCamera; 3 //初始化 4 jsInterfaceCamera=new JSInterface

本页面用来演示如何通过JS SDK,创建完整的QQ登录流程,并调用openapi接口

QQ登录将用户信息存储在cookie中,命名为__qc__k ,请不要占用 __qc__k : 1) :: 在页面顶部引入JS SDK库: 将"js?"后面的appid参数(示例代码中的:100229030)替换成您自己的appid: 示例代码:<script type="text/javascript" src="http://qzonestyle.gtimg.cn/qzone/openapi/qc_loader.js" data-app

保证接口幂等性的解决方案(后台)

假如有个服务提供一个接口(服务部署在多个服务机器),接着有个接口是付款接口.用户在前端上操作的时候,一个订单不小心发起了两次支付请求,然后这两个请求分散在了这个服务部署的不同的机器上,结果一个订单扣款扣两次.这样的场景,就是接口没有保证幂等性的结果. 保证幂等性的核心 1.对于每个请求必须有一个唯一的标识. 2.每次处理完请求之后,必须有一个记录标识这个请求处理过了. 3.每次接收请求需要进行判断之前是否处理过的逻辑处理. 常见解决方案 1.业务表内唯一索引 如果要对创建销售出库单的接口保证幂等