前段時間公司做了個比較大的項目,需要用到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,這樣便可正常調用,且不影響頁面布局。