javascript調用ActiveX接口失敗的解決方案及使用心得

前段時間公司做瞭個比較大的項目,需要用到ocx控件,我廠大部分項目都采用C#.net,而winform程序條用ocx控件接口是相對簡單的,但是javascript調用ocx接口,卻和winform的用法有些不同,其實真捉摸下,也就能發現:差別不大。

 

筆者此次主要闡述在項目中用javascript調用ocx控件接口,也就是activeX控件時所遇到的問題及其解決方案。winform用法不在此篇中闡述。

 

調用activeX插件前,我們要做一些準備工作,我們介紹兩種方案:

 

1.使用regsvr32 命令註冊ocx控件,然後用處理web頁面文件,我們以html文件為例:在DOM結構中添加如下代碼:

 

<object id="ActiveXClient" classid="CLSID:E85D67B7-B439-46C0-8F7B-18C06774B4B0" style="LEFT: 0px; WIDTH: 100%; TOP: 0px; HEIGHT: 1px">

        <param name="_ExtentX" value="22860">

        <param name="_ExtentY" value="1217">

    </object>

之後便可以使用該對象調用activeX控件的接口,調用方法為:ActiveXClient.function();

 

可以直接用ID獲取該接口對象。

 

這中方法有個不便:每次打開IE瀏覽器都會提示:

 

 

 

點擊Allow blocked content才能有權限使用控件接口。當然我們可以降低IE的攔截程度,但這不安全。最重要的是:我們不能強求用戶每次都去點擊這個按鈕去使用我們的插件,更不能要求用戶去降低他們瀏覽器的安全性。於是我們有方案二。

 

2.將ocx控件打包為Cab包,打包方法大傢自行搜索,這裡不作贅述。最後我們得到一個後綴名為cab的文件。

 

同樣加入一個DOM對象到頁面的DOM結構中,但這次有所不同:我們需要加入一個屬性:codebase,該屬性的值為cab包的路徑。例如:

 

<object id="CtiClient" classid="CLSID:E85D67B7-B439-46C0-8F7B-18C06774B4B0" codebase=https://localhost/DownLoad/MyCab.CAB#version=1,5,7,2 style="LEFT: 0px; WIDTH: 100%; TOP: 0px; HEIGHT: 0px">

<param name="_ExtentX" value="22860"><param name="_ExtentY" value="1217"></object>

在打開該頁面,IE會直接彈出提示框:是否要安裝該插件,選擇是。安裝完成後,系統會自動幫我們註冊ocx控件,並讓瀏覽器自行調用,不再有瀏覽器權限的煩惱,一勞永逸。

 

當cab包版本更新時,隻要更新文件,並更改代碼中cab包的版本號,瀏覽器便會自動安裝最新的cab包,易於維護。

 

 

 

下面筆者描述下在開發過程中遇到的問題:頁面提示安裝cab包成功,但我開始調接口時,總說我的接口無效或不存在。但IDE能夠幫助我取到接口,且接口名和參數都與文檔一致,這著實讓筆者困擾瞭很久。

 

最後發現,加到DOM結構中的DOM對象,其display屬性設置為none,即隱藏。大傢都知道,雖然隱藏,但該DOM對象是仍然存在的,可activeX插件就是這樣規定的,不能將它隱藏,於是我們將display:none移除,接口終於能正常調用瞭。為瞭不讓它影響該頁面的樣式,我們可以將它放置在頁面頂部或底部,並將它的高度等屬性設置為0,這樣便可正常調用,且不影響頁面佈局。

 

 

發佈留言