目標:用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; 17jquery.com
一起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
這種方法個人不太喜歡,代碼結構完整性比較差。