javascript
JavaScript 操作 COM 控件
目標(biāo):用JavaScript 腳本代碼調(diào)用COM控件,實(shí)現(xiàn)基本功能操作:
1.定義及初始化COM控件;
2.調(diào)用COM接口;
3.注冊(cè)COM事件并實(shí)現(xiàn)事件調(diào)用。
1. 定義及初始化COM控件
???? 在HTML頁面定義一個(gè)object標(biāo)簽來加載COM控件:
1) classid:是COM控件的編號(hào),用來唯一識(shí)別一個(gè)COM控件;
2) id:是JavaScript調(diào)用COM控件時(shí)訪問的對(duì)象,它是全局對(duì)象,此處將全局對(duì)象命名為ocx;
3) codebase:是打包COM的cab包資源路徑。可以在后面加上#version=1,0,0,1來發(fā)布cab實(shí)現(xiàn)自動(dòng)更新下載。
?
Js代碼 1.<object classid="clsid:D4CCE975-3B00-417A-A520-B265FBFEB178" id="ocx" codebase="CarPlayCtrl.cab" standby="控件加載中..."></object>?
<object classid="clsid:D4CCE975-3B00-417A-A520-B265FBFEB178" id="ocx" codebase="CarPlayCtrl.cab" standby="控件加載中..."></object> [用戶還可以定義其它相關(guān)屬性]
復(fù)制代碼用瀏覽器(IE內(nèi)核)打開頁面后就可以加載COM控件。
2. 調(diào)用COM按口和屬性
2.1 調(diào)用方法
???? 在創(chuàng)建COM標(biāo)簽時(shí)定義了一個(gè)全局對(duì)象ocx。所以之后在JavaScript代碼中調(diào)用控件接口顯示非常容易,類似后Java中表態(tài)訪問的調(diào)用,如調(diào)用創(chuàng)建播放器方法:
COM接口:
Js代碼 1.LONG CreatePlayer(LONG flag,ULONG decTag, BSTR streamerName, LONG playerIndex)?
LONG CreatePlayer(LONG flag,ULONG decTag, BSTR streamerName, LONG playerIndex)
復(fù)制代碼Javascript調(diào)用COM接口:
Js代碼 1.var rtn = ocx.CreatePlayer(0, ”decTag”, ”guanhuistreamer”, -1);??
2.if(rtn <0){??
3.//TODO??
4.}?
var rtn = ocx.CreatePlayer(0, ”decTag”, ”guanhuistreamer”, -1);
if(rtn <0){
//TODO
}
復(fù)制代碼CreatePlayer需要JavaScript傳遞4個(gè)參數(shù)進(jìn)去(這里只涉及×××和字符串類型),并返回一個(gè)數(shù)字類型的值作為判斷標(biāo)志。
2.2 調(diào)用屬性
調(diào)用屬性和方法一樣,只是不用再傳遞參數(shù)給COM,如獲取播放器畫面數(shù)量的屬性:
Js代碼 1.var screenNums = ocx.screenNum;?
var screenNums = ocx.screenNum;
復(fù)制代碼當(dāng)然,也可以設(shè)置屬性的值,如,設(shè)置播放器畫面數(shù)量:
Js代碼 1.ocx.screenNum = 4;?
ocx.screenNum = 4;
復(fù)制代碼3. 注冊(cè)COM事件并實(shí)現(xiàn)函數(shù)回調(diào)
???? 我們可以調(diào)用的COM的方法和屬性來實(shí)現(xiàn)對(duì)COM的訪問和設(shè)置。
???? 但這樣還不夠,因?yàn)槲覀儾荒芸偸侵鲃?dòng)去調(diào)用COM的方法或?qū)傩詠慝@取數(shù)據(jù)。比如要獲取COM當(dāng)前的狀態(tài)(狀態(tài)是不斷改變的)我們就要用譬如輪詢(如:window.setInterval())這樣的方式不斷去訪問接口,這樣既費(fèi)時(shí)又浪費(fèi)系統(tǒng)資源。
???? 所以,如果COM有一個(gè)通知事件,我們就可以將JavaScript函數(shù)注冊(cè)到COM事件中,當(dāng)COM執(zhí)行后調(diào)用該事件時(shí)就可以間接調(diào)用JavaScript函數(shù)來實(shí)現(xiàn)回調(diào)。這樣JavaScript就可以輕松的被動(dòng)接收數(shù)據(jù)。
???? 以下是播放器窗口焦點(diǎn)變化時(shí)通知JavaScript做出的相關(guān)響應(yīng)的一系列實(shí)現(xiàn)過程:
a) ActiveScreenChanged(LONG playerIndex):是COM中的通知事件,在注冊(cè)時(shí)不用帶參數(shù)。
b) regOcxActiveScreen():是JavaScript中的注冊(cè)事件;
c) listener_ActiveScreen(playerIndex):是JavaScript中的回調(diào)函數(shù),在注冊(cè)時(shí)不用帶參數(shù)。
1) 定義JavaScript注冊(cè)事件:
Js代碼 1.function regOcxActiveScreen() {??
2.var focus = document.getElementById("ocx");??
3.if ($.browser.msie) {??
4.//IE內(nèi)核瀏覽器的注冊(cè)方式??
5.focus.attachEvent("ActiveScreenChanged",listener_ActiveScreen);??
6.} else {??
7.//非IE內(nèi)核瀏覽器注冊(cè)方式??
8.//當(dāng)然這里其實(shí)沒有必要,因?yàn)橹挥蠭E內(nèi)核瀏覽器才能執(zhí)行此處討論的COM組件??
9.focus.addEventListener("ActiveScreenChanged",listener_ActiveScreen);??
10.}??
11.}?
function regOcxActiveScreen() {
var focus = document.getElementById("ocx");
if ($.browser.msie) {
//IE內(nèi)核瀏覽器的注冊(cè)方式
focus.attachEvent("ActiveScreenChanged",listener_ActiveScreen);
} else {
//非IE內(nèi)核瀏覽器注冊(cè)方式
//當(dāng)然這里其實(shí)沒有必要,因?yàn)橹挥蠭E內(nèi)核瀏覽器才能執(zhí)行此處討論的COM組件
focus.addEventListener("ActiveScreenChanged",listener_ActiveScreen);
}
}
復(fù)制代碼[也可以直接使用:ocx.attachEvent("ActiveScreenChanged",listener_ActiveScreen);來注冊(cè)就可以了,因?yàn)橹耙呀?jīng)定義了ocx,此處只是再取一個(gè)別名。]
2) 定義JavaScript回調(diào)函數(shù):
Js代碼 1.function listener_ActiveScreen(playerIndex) {??
2.??? $('#currentWin').html('播放窗口:' + playerIndex);??
3.//TODO??
4.}?
function listener_ActiveScreen(playerIndex) {
??? $('#currentWin').html('播放窗口:' + playerIndex);
//TODO
}
復(fù)制代碼還有一種調(diào)用方式是直接在頁面中通過script標(biāo)簽來實(shí)現(xiàn)的,如:
Js代碼 1.<script language="JavaScript" for="ocx" event="ocxMethod(parm)">??
2.alert(parm);??
3.//TODO??
4.</script>?
<script language="JavaScript" for="ocx" event="ocxMethod(parm)">
alert(parm);
//TODO
</script>?
復(fù)制代碼這種方法個(gè)人不太喜歡,代碼結(jié)構(gòu)完整性比較差。
轉(zhuǎn)載于:https://blog.51cto.com/wws5201985/737004
總結(jié)
以上是生活随笔為你收集整理的JavaScript 操作 COM 控件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三四岁的小孩,学习什么好呢?男孩,胆子有
- 下一篇: 深入理解JavaScript系列(4):