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.ocx
mwhrf_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=thiscab
FileVersion=1,0,0,0
DestDir=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文件的具體內容可參考以下文章相關部分,已經非常詳細了:
VC2005從開發MFC ActiveX ocx控件到發布到.net網站的全部過程
注:如果考慮到終端用戶的權限以及將ActiveX注冊到什么位置(Current User或Machine),可參考
3、運行如下命令進行打包:
cabarc" -s 6144 N "xxxxxx.cab" "xxxxx.ocx" "mwhrf_bj.dll" "xxxxxx.inf"
其中凡是需要打包的文件均要一一列出,inf文件放在最后(未測試是否必須最后)。文件路徑均可以是絕對路徑或相對路徑,不一定非得是相同文件夾下。
命令執行后將自動生成.cab文件。

