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=http://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,這樣便可正常調用,且不影響頁面布局。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM