JavaScript 操作 COM 控件

目标:用JavaScript 脚本代码调用COM控件,实现基本功能操作:
1.定义及初始化COM控件;
2.调用COM接口;
3.注册COM事件并实现事件调用。

1. 定义及初始化COM控件
在HTML页面定义一个object标签来加载COM控件:
1) classid:是COM控件的编号,用来唯一识别一个COM控件;
2) id:是JavaScript调用COM控件时访问的对象,它是全局对象,此处将全局对象命名为ocx;
3) codebase:是打包COM的cab包资源路径。可以在后面加上#version=1,0,0,1来发布cab实现自动更新下载。 一起jquery,17jquery

一起jquery,17jquery

<object classid="clsid:D4CCE975-3B00-417A-A520-B265FBFEB178" id="ocx" codebase="CarPlayCtrl.cab" standby="控件加载中..."></object> 

内容来自17jquery

[用户还可以定义其它相关属性]

内容来自17jquery

 

用浏览器(IE内核)打开页面后就可以加载COM控件。

2. 调用COM按口和属性
2.1 调用方法
在创建COM标签时定义了一个全局对象ocx。所以之后在JavaScript代码中调用控件接口显示非常容易,类似后Java中表态访问的调用,如调用创建播放器方法:

COM接口: 内容来自17jquery

LONG CreatePlayer(LONG flag,ULONG decTag, BSTR streamerName, LONG playerIndex) 

内容来自17jquery

一起jquery,17jquery

 

Javascript调用COM接口:

一起jquery,17jquery

 

var rtn = ocx.CreatePlayer(0, ”decTag”, ”guanhuistreamer”, -1);
if(rtn <0){
//TODO
} 

一起jquery,17jquery

一起jquery,17jquery

一起jquery,17jquery

 

CreatePlayer需要JavaScript传递4个参数进去(这里只涉及整形和字符串类型),并返回一个数字类型的值作为判断标志。

17jquery.com

 

2.2 调用属性
调用属性和方法一样,只是不用再传递参数给COM,如获取播放器画面数量的属性: 内容来自17jquery

var screenNums = ocx.screenNum;  

一起jquery,17jquery

当然,也可以设置属性的值,如,设置播放器画面数量:

内容来自17jquery

 

ocx.screenNum = 4; 

内容来自17jquery

一起jquery,17jquery

3. 注册COM事件并实现函数回调
我们可以调用的COM的方法和属性来实现对COM的访问和设置。
但这样还不够,因为我们不能总是主动去调用COM的方法或属性来获取数据。比如要获取COM当前的状态(状态是不断改变的)我们就要用譬如轮询(如:window.setInterval())这样的方式不断去访问接口,这样既费时又浪费系统资源。
所以,如果COM有一个通知事件,我们就可以将JavaScript函数注册到COM事件中,当COM执行后调用该事件时就可以间接调用JavaScript函数来实现回调。这样JavaScript就可以轻松的被动接收数据。

以下是播放器窗口焦点变化时通知JavaScript做出的相关响应的一系列实现过程:
a) ActiveScreenChanged(LONG playerIndex):是COM中的通知事件,在注册时不用带参数。
b) regOcxActiveScreen():是JavaScript中的注册事件;
c) listener_ActiveScreen(playerIndex):是JavaScript中的回调函数,在注册时不用带参数。

1) 定义JavaScript注册事件: 内容来自17jquery

function regOcxActiveScreen() {
var focus = document.getElementById("ocx");
if ($.browser.msie) {
//IE内核浏览器的注册方式
focus.attachEvent("ActiveScreenChanged",listener_ActiveScreen);
} else {
//非IE内核浏览器注册方式
//当然这里其实没有必要,因为只有IE内核浏览器才能执行此处讨论的COM组件
focus.addEventListener("ActiveScreenChanged",listener_ActiveScreen);
}
}
 

内容来自17jquery

内容来自17jquery

[也可以直接使用:ocx.attachEvent("ActiveScreenChanged",listener_ActiveScreen);来注册就可以了,因为之前已经定义了ocx,此处只是再取一个别名。]

2) 定义JavaScript回调函数:

内容来自17jquery

 

function listener_ActiveScreen(playerIndex) {
    $('#currentWin').html('播放窗口:' + playerIndex);
//TODO
} 

内容来自17jquery

17jquery.com

17jquery.com

 

还有一种调用方式是直接在页面中通过script标签来实现的,如:

内容来自17jquery

 

<script language="JavaScript" for="ocx" event="ocxMethod(parm)">
alert(parm);
//TODO
</script> 

内容来自17jquery

这种方法个人不太喜欢,代码结构完整性比较差。

时间: 2024-08-30 20:11:01

JavaScript 操作 COM 控件的相关文章

ASP.NET与JavaScript操作CheckBox控件

asp.net|javascript|控件 在网络开发中,经常遇到需要使用ASP.NET与JavaScript联合进行控制的情况.在本篇中,将使用DataGrid进行数据绑定,使用Javascript控制当选中其中的checkbox时,该行颜色改变. 首先,在页面中创建一个DataGrid控件,并设置其模板. <asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False&

如何通过javascript操作web控件的自定义属性_javascript技巧

在编程时,有时会使用web服务器控件的自定义属性.例如,TextBox控件中没有IsNotNull属性,但是我们可以自己添加一个IsNotNull属性,从而作为一个标记来方便我们编写程序. 虽然,IDE会提示"IsNotNull不是TextBox的属性"这个警告信息但是也不妨碍我们使用! 代码:<asp:TextBox ID="TextBox1" runat="server" IsNotNull="e"></

Javascript 操作select控件大全(新增、修改、删除、选中、清空、判断存在等)

1判断select选项中 是否存在Value="paraValue"的Item   2向select选项中 加入一个Item   3从select选项中 删除一个Item   4删除select中选中的项   5修改select选项中 value="paraValue"的text为"paraText"   6设置select中text="paraText"的第一个Item为选中   7设置select中value="

javascript客户端遍历控件与获取父容器对象示例代码

 本篇文章主要是对javascript客户端遍历控件与获取父容器对象示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 1,遍历也面中所有的控件 function findControlAll()     {         var inputs=document.getElementsByTagName("input");         for(j=0;j<inputs.length;j++)            if(inputs[j].type==&quo

自己动手写的javascript前端等待控件_javascript技巧

等待控件在网上搜有好多种,但是都很复杂,不一定用的顺手,再说我的项目是bootstrap的原因,又不敢轻易使用第三方控件,怕不兼容,于是自己动手写了个等待控件,其技术点包括动态加载CSS,javascript的命名空间,所以记录一下. 这个等待控件主要是:进行某个操作前,显示一个信息提示:"数据加载中,请稍候...",操作成功后,在回调函数中将提示消失,原理是这个等待控件完全由JS动态加进去,包括CSS,页面中并无预先设定. 那么这个CSS怎么动态加载呢?等待控件中,样式使用了clas

javascript控制页面控件隐藏显示的两种方法

javascript|控件|控制|显示|页面 javascript控制页面控件隐藏显示的两种方法,方法的不同之处在于控件隐藏后是否还在页面上占位 方法一: document.all["PanelSMS"].style.visibility="hidden"; document.all["PanelSMS"].style.visibility="visible"; 方法二: document.all["PanelSMS

javascript模拟评分控件实现方法

  本文实例讲述了javascript模拟评分控件实现方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 <html xmlns="http://www.w3.org/1999/xhtml">

数据-VB利用句柄操作MSHFlexgrid控件

问题描述 VB利用句柄操作MSHFlexgrid控件 一个软件有MSHFlexgrid控件,可以获得MSHFlexgrid控件句柄.但怎样才能向MSHFlexgrid控件(1.1)单元格输入数据.用VB的 解决方案 利用句柄找到这个控件对象,强制转换为相应的类型.然后就可以按正常属性进行操作 解决方案二: 有具体实现代码吗?恳请指教下,谢谢.

winform操作webbrowser控件,全自动延时执行过程的精准控制!

问题描述 winform操作webbrowser控件,全自动延时执行过程的精准控制! 如题,我有20个方法(都是操作webbrowser控件的)需要依次执行,执行第一个方法之后会返回一个结果,根据这个结果判断第一个方法是否执行成功,但第一个方法执行完毕的时间是未知的,我又必要等待这个返回结果判断是否成功,才能决定多久调用下一个方法执行! 核心问题就是:怎样去等待上一方法个执行完毕返回结果(每个方法都操作webbrowser控件的,都是未知的延迟等待时间),在这个等待的时间里我又不能中断线程,因为