javascript
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實現自動更新下載。
?
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> [用戶還可以定義其它相關屬性]
復制代碼用瀏覽器(IE內核)打開頁面后就可以加載COM控件。
2. 調用COM按口和屬性
2.1 調用方法
???? 在創建COM標簽時定義了一個全局對象ocx。所以之后在JavaScript代碼中調用控件接口顯示非常容易,類似后Java中表態訪問的調用,如調用創建播放器方法:
COM接口:
Js代碼 1.LONG CreatePlayer(LONG flag,ULONG decTag, BSTR streamerName, LONG playerIndex)?
LONG CreatePlayer(LONG flag,ULONG decTag, BSTR streamerName, LONG playerIndex)
復制代碼Javascript調用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
}
復制代碼CreatePlayer需要JavaScript傳遞4個參數進去(這里只涉及×××和字符串類型),并返回一個數字類型的值作為判斷標志。
2.2 調用屬性
調用屬性和方法一樣,只是不用再傳遞參數給COM,如獲取播放器畫面數量的屬性:
Js代碼 1.var screenNums = ocx.screenNum;?
var screenNums = ocx.screenNum;
復制代碼當然,也可以設置屬性的值,如,設置播放器畫面數量:
Js代碼 1.ocx.screenNum = 4;?
ocx.screenNum = 4;
復制代碼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注冊事件:
Js代碼 1.function regOcxActiveScreen() {??
2.var focus = document.getElementById("ocx");??
3.if ($.browser.msie) {??
4.//IE內核瀏覽器的注冊方式??
5.focus.attachEvent("ActiveScreenChanged",listener_ActiveScreen);??
6.} else {??
7.//非IE內核瀏覽器注冊方式??
8.//當然這里其實沒有必要,因為只有IE內核瀏覽器才能執行此處討論的COM組件??
9.focus.addEventListener("ActiveScreenChanged",listener_ActiveScreen);??
10.}??
11.}?
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);
}
}
復制代碼[也可以直接使用:ocx.attachEvent("ActiveScreenChanged",listener_ActiveScreen);來注冊就可以了,因為之前已經定義了ocx,此處只是再取一個別名。]
2) 定義JavaScript回調函數:
Js代碼 1.function listener_ActiveScreen(playerIndex) {??
2.??? $('#currentWin').html('播放窗口:' + playerIndex);??
3.//TODO??
4.}?
function listener_ActiveScreen(playerIndex) {
??? $('#currentWin').html('播放窗口:' + playerIndex);
//TODO
}
復制代碼還有一種調用方式是直接在頁面中通過script標簽來實現的,如:
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>?
復制代碼這種方法個人不太喜歡,代碼結構完整性比較差。
轉載于:https://blog.51cto.com/wws5201985/737004
總結
以上是生活随笔為你收集整理的JavaScript 操作 COM 控件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三四岁的小孩,学习什么好呢?男孩,胆子有
- 下一篇: 足以致死的安眠药药量是多少?以毫克表示