ActiveX控件打包cab時INF文件的編寫

雖然微軟對ActiveX越來越不信任,但是這個技術還是很多人喜歡用的,這個博客的編輯器貌似就用到了ActiveX。

在我們編寫好ocx控件後只有在打包成CAB文件加入數字簽名後才能正常發佈,如果你用的是vc6,那麼問題簡單了,打包完成後不用考慮控件的運行庫問題,現在的XP系統和將要淘汰的2kpro都已經有了這樣的運行庫。但是如果使用的是.net2005就會遇到有關運行庫的問題,這些問題只能依靠CAB壓縮包中的安裝文件 .inf來解決。

首先看看基本的inf文件格式

[version]
;區域設置
signature="$CHICAGO$"
AdvancedINF
=2.0 

[Add.Code]
;該項會指明該安裝包中有哪些項,這裏說明包中有ActiveX.ocx、msvcr80.dll、mfc80u.dll、msvcp80.dll 四個項
;
這裏一般會使用文件名和項名相同的方法,主要是便於維護
ActiveX.ocx=ActiveX.ocx
msvcr80.dll
=msvcr80.dll
mfc80u.dll
=mfc80u.dll
msvcp80.dll
=msvcp80.dll

[ActiveX.ocx]
;這就是Activex控件文件了
file-win32-x86=thiscab 
;表示所需要的這個文件就在當前的安裝包中,file-win32-x86表示該文件是一個win32系統下的文件
clsid={A3B4C60F-24A7-40E8-A06B-1A5EFE5F0A43}
;這裏是這個安裝包的GUID這個值是在創建項目的時候系統生成在,一般存放在以項目名命名的idl文件中,使用項目的類信息的GUID
RegisterServer=yes
;說明這個控件是需要註冊的,
;
一般情況下只有編寫的文件是需要註冊的,運行庫文件和系統中可能存在的DLL文件是不用註冊的,如MFC70.dll等
FileVersion=1,0,0,1
;這個文件的版本,注意要用逗號隔開

[msvcr80.dll]
;這是ocx控件的第一個依賴文件,有的地方說明依賴文件必須按照依賴順序安裝,可以用"所剩dll都依賴的文件最先安裝”的規則來進行,但是我並沒有在MSDN上看到什麼地方有很明確的說明,並且在我自己的測試中也沒有發現有關順序的問題,並且很多地方都是將ocx控件寫在最前面的,但是ocx文件是最依賴其他文件的,貌似按順序寫的做法有點“迷信”
FileVersion=8,00,50727,42
;這裏是該dll文件的版本,這裏注意下,這個版本可以在文件屬性的版本選項卡中看到,不知道爲什麼這裏顯示的版本號有時會比最外面顯示的版本號多一個0,注意,複製到inf文件後要將點分隔符改成逗號分隔符
hook=mfc80installer
;這個hook是個保留字,說明該項目被掛接到哪裏,如果有則表示被掛接到目標項,hook不是一個必填項,這裏表示該文件將被掛接到mfc80installer項

[mfc80u.dll]
FileVersion
=8,00,50727,42
hook
=mfc80installer
 
[msvcp80.dll]
FileVersion
=8,00,50727,42
hook
=mfc80installer
;上面兩項都跟[msvcr80.dll]一樣,這裏就不解釋了

[mfc80installer]
;掛接項
file-win32-x86=http://192.168.1.117/helloactivex/mfc80.cab
;這裏表示這個被掛接的文件的位置在一個地址
run=%EXTRACT_DIR%vcredist_x86.exe
;這裏表示從這個地址下載到cab包後執行包裏面的vcredist_x86.exe文件,%EXTRACT_DIR%表示下載後的解壓目錄

上面有一點沒有說明白,就是“爲什麼會出現hook這個東西?”,很多的inf文件是這樣寫的

[Add.Code]
msvcr80.dll
=msvcr80.dll
mfc80u.dll
=mfc80u.dll
msvcp80.dll
=msvcp80.dll
ActiveX.ocx
=ActiveX.ocx


[msvcr80.dll]
file-win32-x86
=thiscab
;該文件在當前安裝包中
FileVersion=8,00,50727,42
RegisterServer
=no 
;不需要註冊
destdir=11
;該文件將被安裝到系統所在目錄的system32下

;........

我使用這樣的方法在沒有安裝過任何軟件的2kpro和XP下測試過,均安裝失敗,其原因就是運行庫不匹配,如果你的控件是用VS2005的MFC開發的話,使用這樣的方法無法將msvcr80.dll,mfc80u.dll,msvcp80.dll這幾個控件依賴的文件安裝到目標位置的,具體是什麼原因我也不明白。

這裏的hook就是爲了解決上面說的問題:要給被按裝該控件的機器安裝一個運行環境。很多人可能都看過http://support.microsoft.com/kb/167158/這裏說明了如何製作一個inf文件,但是很可惜,微軟對mfc的下載支持到VC 6.0就結束了,並且,這裏還有一個錯誤,在他的主要示例中有一段

[mfc42installer]
   file-win32-x86
=VALUE=http://activex.microsoft.com/controls/vc/mfc42.cab

上面的“VALUE=”是沒有必要的,如果增加了該內容反而會讓安裝包無法下載。

有了在依賴文件dll的項中有了掛接的hook的值後安裝文件會到hook的位置去找需要下載安裝的文件,這裏我將/Microsoft Visual Studio 8/SDK/v2.0/BootStrapper/Packages/vcredist_x86/vcredist_x86.exe文件做成一個cab文件MFC80.cab,這個包裏面只有一個vcredist_x86.exe文件,沒有其他文件。

按照上面的方法打包好mfc8的運行庫並使用hook的方式將Dll和運行庫文件掛接後就可以了。

以上內容在沒有安裝任何軟件的XP和2k pro上測都通過了,順便說下,Activex控件,只要在控件測試的那個工具中跑成了就是好的,如果目標機器上出不來就是環境問題,inf是解決環境問題的唯一途徑。

最後補充一點,上面說的都是在發佈Release版本的情況,如果是Debug版本就會少兩個庫文件“MFC80D.DLL”和“MSVCR80D.DLL”

 

本博客轉載CSDN網友http://blog.csdn.net/immc1979/archive/2007/04/20/1572222.aspx,本人覺得寫得非常的實在,一看就是從實際經驗中總結出來的,借鑑了,感謝

發佈了19 篇原創文章 · 獲贊 12 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章