JavaScript 操作 COM 控制項

來源:互聯網
上載者:User

目標:用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

這種方法個人不太喜歡,代碼結構完整性比較差。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.