ActiveX外掛程式如果想在Html中進行引用,必須先對外掛程式ocx檔案進行註冊,即通過regsvr32將該控制項註冊到使用者的作業系統裡。在實際應用中,一般有兩種方式來達到這個目的:
一、通過安裝程式註冊ActiveX
這種方式非常直觀,就是製作一個簡單的安裝程式,該安裝程式的任務就是將打包的ocx檔案及其依賴檔案解壓複製到系統目標位置,然後再通過執行regsvr32命令將已複製到使用者機器目標位置的ocx檔案註冊到系統中。當web頁面中需要調用相應的ActiveX時,將在顯著位置提示使用者需下載指定的程式並運行安裝。
實際很多應用程式在安裝時都隱含地向系統註冊了一些ActiveX的,例如QQ、飛信、播放器等,這樣相應的web就更加靈活。不過,並不是所有的ActiveX外掛程式都是以ocx檔案呈現的,也可以是dll檔案。
二、通過cab包由IE自動註冊
能否在web頁面需要引用ActiveX時由IE自動下載對應的外掛程式並自動安裝呢?當然可以。我們要做的就是要將ocx及其他檔案打包成一個cab檔案,然後將該cab檔案放在web伺服器上,並在web頁面中通過<object ….. codebase=”xxx.cab#version=1,0,0,1” />的方式進行調用。
cab實際上是微軟規定的一個特殊格式的壓縮檔,製作cab包過程很簡單:
1、 準備cabarc.exe工具,該工具可以在這裡下載,也可以從微軟下載;
2、 將ocx檔案及依賴的其他檔案放到同一個目錄下,並在該目錄下建立一個尾碼為.inf的檔案(檔案名稱可任意取,一般與ocx檔案同名,例如MyTestActiveX.inf),檔案內容如下:
[version] signature="$CHICAGO$" AdvancedINF=2.0 [Add.Code] MyTestActiveX.ocx=MyTestActiveX.ocxmwhrf_bj.dll = mwhrf_bj.dll [MyTestActiveX.ocx] file=thiscab clsid={1345C26B-E979-45A5-997D-9427FB81E707} FileVersion=1,0,0,1 RegisterServer=yes DestDir=11 [mwhrf_bj.dll] file=thiscabFileVersion=1,0,0,0DestDir=10
a) signature="$CHICAGO$"表示這個.INF檔案和Windows95或其後版本和Windows NT 4.0或其後的版本相容。
b) [Add.Code]下面的內容用於定義該cab需要下載的各檔案對應的定義區塊,左邊為檔案名稱,等號右邊為定義地區名,一般為易讀均將定義的地區名與檔案名稱相同。
c) 各檔案的定義地區分別定義了該檔案的各種屬性:
file:表示該檔案的擷取位置,此處thiscab表示該檔案就包含在該cab中;如果在其他位置而不在cab包中,則可以寫上具體的位置如http://xxx.xxx.xxx/xx/mwhrf_bj.dll
clsid: 只有需要註冊的ocx檔案才設定這個屬性,他的值就是改ocx的唯一classid,可以從項目的.idl檔案中最下方尋找;
FileVersion:檔案版本號碼。一般將ocx檔案的版本號碼視同為整個cab的版本號碼,在<object codebase=”xx.cab#version=1,0,0,1”中將用到該版本號碼。
DestDir:該檔案需要COPY到目標機器的位置,11表示system32目錄下,10表示windows目錄下,……
有關inf檔案的具體內容可參考以下文章相關部分,已經非常詳細了:
OCX控制項CAB打包手冊及升級方法
INF檔案的文法解說
建立 CAB 檔案
VC2005從開發MFC ActiveX ocx控制項到發布到.net網站的全部過程
注:如果考慮到終端使用者的許可權以及將ActiveX註冊到什麼位置(Current User或Machine),可參考
Non-Admin ActiveX Controls
3、運行如下命令進行打包:
cabarc" -s 6144 N "xxxxxx.cab" "xxxxx.ocx" "mwhrf_bj.dll" "xxxxxx.inf"
其中凡是需要打包的檔案均要一一列出,inf檔案放在最後(未測試是否必須最後)。檔案路徑均可以是絕對路徑或相對路徑,不一定非得是相同檔案夾下。
命令執行後將自動產生.cab檔案。