天天看點

【轉】制作cab包的方法

解決方案:

這種自動下載下傳功能,是Internet Explorer的5.X以上版本提供的一種基于Active X的方式。IE浏覽器會通過網頁裡面的<object>标簽所标示的軟體名稱以及版本,檢測目前系統中是否裝有該軟體,若裝了,則檢測版本是否比它老,當目前系統中沒有該軟體或者版本不夠新時,IE就會自動安裝該軟體,當然在安裝軟體之前,它會有一個安全認證的過程。

實作步驟:

1.選擇檔案

要安裝的插件或者程式必然是有一個或者多個檔案組成的,它可以是.exe可執行檔案,也可以是.ocx、.dll等類型的檔案。首先我們要安裝的檔案準備好,最好存放在同一目錄内,以便下一步的制作。我在這裡標明了個檔案做示範,test.dll,準備安裝到目前windows的系統目錄。

2.制作.inf檔案。

.inf檔案也就是安裝配置檔案。它指定了軟體包内需要安裝的檔案和這些需要安裝的目标目錄,需要建立的程式組以及需要改動的系統資料庫内容。絕大部分的安裝程式都包含這類檔案。

普通的.inf檔案一般分為幾節。見表1

[Version] 用于确認.inf檔案的基本版本資訊

[DefaultInstall] 預設情況下,會執行的一節。包含指向其他節的指針,該節可用于指定要複制和删除的檔案、系統資料庫的更新、.inf檔案的更新等。

[DestinationDirs] 指定硬碟上複制、删除或重命名節檔案的位置(列如\windows或windows\system)。

[fileCopy/Delete/RenameSection(s)] 列出要複制、删除或重命名的檔案。

[Strings] 列出上面所使用的可本地化字元串。

表1

需要重點說明的就是目标檔案夾“DestinationDirs”一節,我們一般使用邏輯磁盤标示符(LDID),其中25表示system目錄,其他見表2

00 Null LDID-可用于建立新的LDID

01 Source Drive:\pathname

10 Machine檔案夾(在基于伺服器的安裝時,映射windows檔案夾)

11 System檔案夾

12 IOSubsys檔案夾

13 Command檔案夾

17 Inffolder

18 Help檔案夾

20 Fonts

21 Viewers

22 VMM32

23 Color檔案夾

24 包含windows檔案夾的驅動器根目錄

25 windows檔案夾

26 windows的約定引導裝置(Winboot)

28 Host Winboo

30 啟動盤的根檔案夾

31 虛拟啟動盤的主驅動器根檔案夾

表2

3.制作軟體包

我們要将插件或者軟體最終在網頁上釋出,還必須将它做成windows的.cab壓縮軟體包。制作該軟體包的工具IExpress在高版本的 windows裡面已經提供,如果windows版本不夠高,可以在IE5安裝程式中查找IEAK5.EXE或者IEAK5CD.EXE,執行該檔案即可。

運作Iexpress程式,選擇Create Compressed files only(Active Installs),這樣制作出的即是.cab檔案。接下來是軟體包的命名,我們不妨命名為test.cab檔案。然後再選取test.dll、 test.inf兩個檔案進行打包。

4.進行數字簽名

雖然我們做好了軟體包,但是如果不用電子證書對他進行數字簽名的話,它是不能通過用戶端的安全檢查的(除非安全級别設成“低”)。可使用signcode.exe,下載下傳位址download/signcode.exe。

5.在網頁上釋出軟體包

我們的終極目的當然是要在網頁上釋出該軟體或插件。需要使用的HTML元素是:<object></object>

先将我們的操作中涉及的它的屬性介紹如下:

clsid:生成的類在windows中的編号,這裡涉及部分windows系統資料庫知識,本文不再贅述。

codebase:指定需要下載下傳的軟體位址及其版本。

比如我們可以在網頁中寫入:

<object classid="clsid:A27CDB6E-AE6D-11CF-96B8-444553540000" codebase="test.cab#Version=1,0,0,0" VIEWASTEXT>

</object>

這裡要提示大家的是,如果你并不清楚自己的軟體應該設定成什麼版本的時候,可以寫上Version=-1,-1,-1,-1,這樣就可以達到如果用戶端沒有該軟體就下載下傳,倘若下載下傳過就忽略的目的。

最後,我們要做的就是體驗自己的成果了。

制作cab安裝包是一件挺簡單的事情,如果大家寫的主題或者程式 涉及到系統資料庫的修改,建議使用cab安裝包來進行安裝。

首先你需要如下幾個檔案 ,CabwizSP.exe ,cabwiz.ddf。

好了,下面進入正文,要制作.cab安裝包,你隻要寫一個.inf檔案,CabwizSP.exe會根據你的這個INF檔案來生成_setup.xml ,那麼檔案要如何寫呢?其實很簡單,我會提供一個範本,大家隻要修改[SourceDisksFiles]之後的字段即可。

下面我就來解釋一下主要字段的含義。

第一個字段[Version]中Provider大家可以随便改,其他兩個參數就不要去碰了。

第二個字段[CEStings]的AppName=""就是你為所要安裝的程式所起的名字。完整的名字将會是Provider參數的字元 串加上AppName參數的字元串,例如範本,最後出現在删除程式中的名字就是“MGCN iMac”。

第三個字段[CEDevice.ARM720],CEDevice字段是程式所對應的裝置平台 ,這個大家就不用去管它了,寫smartphone的inf檔案時候加上這個字段就行了。

下面的[SourceDisksNames]是指定源檔案所在的磁盤和路徑,這裡我也搞不太清楚,sdk中的例子 也看不懂,我用絕對路徑也不行,索性就直接用.代替,反正大家copy就是了(看補充1),這樣,大家隻要把要打包的檔案要和inf放在一起就可以了。

下面一個字段[SourceDisksFiles]就是大家要打包的檔案清單,後面的=1就表示檔案的路徑,也就是[SourceDisksNames]中的 1。再下一個字段[DefaultInstall]就是安裝步驟,範本中CopyFiles參數和AddReg參數表示安裝不僅僅是解壓拷貝檔案,還要修改系統資料庫。CopyFiles=後面跟着是字段名字,即你所要做的拷貝工作到底有哪些。AddReg=作用一樣。例如在範本中,CopyFiles=CopyToHomeDir,CopyToiMacDir就是告訴CabwizSP.exe要做兩個拷貝檔案工作,第一個是把一些檔案拷貝到Home檔案夾下,要拷貝的檔案在[CopyToHomeDir]字段中,第二個是把一些檔案拷貝到iMac檔案夾下,要拷貝的檔案在 [CopyToiMacDir]而AddReg=RegData表示安裝程式還要修改系統資料庫,修改的東西在[RegData]字段中。下一個字段就是目标檔案夾的具體位置。兩個參數CopyToHomeDir和CopyToiMacDir要和上個字段的CopyFiles等号右邊的兩個字元串值分别相同。這裡0我也不清楚是什麼意思,sdk中找不到,%CE19%就表示\Storage\Application Data(看最後注釋)

再下一個字段[CopyToHomeDir]就是具體的任務配置設定了,引号裡面表示解壓後的檔案名,必須和你壓縮前的檔案名相同,即必須在 [SourceDisksFiles]中能找到相應的檔案,後面表示拷貝到相應目錄後的檔案名,如果沒特殊要求就不要改名了。後面一個字段作用和這個相同,我就不多說了,最後是修改系統資料庫段,第一個“,”之前表示系統資料庫中的四大塊的名字,直接用縮寫就可以了,如範本中HKLM就代表 HKEY_LOCAL_MACHINE,其他三個分别為HKCR,HKCU和HKU。第二個“,”之前表示你要修改的鍵的具體路徑(如果沒有會自動 建立),即完整的項(key)名稱,第三個“,”之前就表示你要具體修改的鍵(就是我們經常在修改系統資料庫的文章中看到的Value Name),如果沒有的話程式就會自動建立,第四個“,”之前表示值類型,目前我隻懂得整數是0x00010001(見補充2),字元型資料 這裡你就不要填了,留着個“,”就可以了。最後就是你要填入的Value。

例如在範例中HKLM,SOFTWARE\Microsoft\Shell\Rai\:CallAlert,BKBitmapFile,,"\Storage\Application Data\Home\iMac\call1.jpg" 表示修改(建立)名為BKBitmapFile的鍵的值,它在HKLM\SOFTWARE\Microsoft\Shell\Rai \:CallAlert下,值内容為\Storage\Application Data\Home\iMac\call1.jpg,很明顯,這是一個值為String類型的鍵。整數的我就不說了,範本中有,我相信大家看得懂。

好了,inf檔案寫好了,copy你要打包的檔案和inf檔案到含有CabwizSP.exe,cabwiz.ddf的目錄中,在指令行模式 下輸入CabwizSP xx.inf,xx代表你為inf檔案起的名字,那麼一個帶_setup.xml的.cab包就生成完畢了,安裝一下,看看自己的成果吧。

注釋:%A%表示引用A參數的值,如CopyToHomeDir = 1,%CE1%\%AppName%的話就代表\storage\program files\MGCN iMac。(在範例中AppName=Provider+AppName="MGCN"+"iMac"),而對于%CEX%,系統 在安裝程式時候會自動翻譯,如%CE19%翻譯結果是\Application Data,又如CE1表示\program files,CE2表示\windows , 最後的翻譯結果系統會在前面已翻譯的結果上再加上預設的storage卷标名(前提是存在預設的storage卷标名),如Smartphone的預設磁盤卷标是Storage,那麼%CE19%最終就變成了\Storage\Application Data。有興趣的可以去翻翻SDK 看看到底有多少的%CEX%。

補充1:從modaco的那篇英文文章知道,[SourceDisksNames]包含有四個域,域與域之間用逗号隔開,第一個域是disk_id,磁盤的id(我什麼都試過了,這個實在不懂啥意思...大家就表管它意義了。),第二個域是注釋,要用""把注釋内容包含起來,第三個不知道,第四個是檔案路徑,“.”就表示目前目錄,“..”表示目前目錄的上一級目錄。

補充2:第四個","之前0x00010001稱之為Flag,應該說是對後面value具體類型的表明。幾個flag說明如下:

0x00000002 如果注冊的鍵(值)存在,則不修改它,不存在的話值就等于最後一個域的内容了(廢話...)這個flag可以和下面的任何flag混用(具體怎麼混用我也不懂,如果你用這個Flag的話,後面所跟的内容就是string類型了,按理說可以指定後面内容的類型的,不過我試不出來,sdk中也找不到相關說明,估計要去msdn中去找才行...)

0x00000000 表明是String類型,對應系統資料庫中的REG_SZ資料類型。

0x00010000 表明是Multi-String類型,對應REG_MULTI_SZ資料類型。就是說包含有很多個字元串,每個字元串用“,”隔開。 HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSClog,BKFlags,0x00010000,"xxx","yyy","zzz"

0x00000001 二進制類型,對應系統資料庫中的REG_BINARY資料類型,你可以寫好幾個不同的的二進制,每個二進制數就代表一個域,域與域之間用","隔開,注意不能用0x打頭(16進制的頭标志)。格式如下:HKLM,SOFTWARE\Microsoft\Shell\Rai \:MSClog,BKFlags,0x00000001,00,01,11,10,11,10

0x00010001 表示是整數,對應系統資料庫中的REG_DWORD資料類型。如果數字前面加0x表示十六進制數字,寫入系統資料庫時會自動翻譯成十進制。如:HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSClog,BKFlags,0x00010001,0x26那麼生成 _setup.xml時候0x26就變成了38,datatype還是integer。

補充3:[String]字段。這個字段是用來定義 你要重複使用的字元串的縮寫的,比如你"Software\Microsoft\My Test App"這個字元串用得很多,你可以用r來代表,隻要你在這個字段中寫入r = "Software\Microsoft\My Test App" 那麼再後面字段中你就可以用%r%來表示Software\Microsoft\My Test App了,例如在系統資料庫字段中你可以這樣寫HKLM,%r%,test,0x00010001,3,就等同于 HKLM,Software\Microsoft\My Test App,test,0x00010001,3

補充4:關于建立快捷鍵。形式如下,主要是要在[DefaultInstall],[DestinationDirs]加入相應的項目,并且要建立一個字段,字段名字可以随便取,不過注意三個字段中這個名字都要一樣。如:

[DefaultInstall]

CEShortcuts = Shortcuts

[DestinationDirs]

Shortcuts = 0,%CE14%

[Shortcuts]

Sample App,0,sample.exe

Sample App,0,sample.exe,%InstallDir%

這裡主要是最後一個字段的文法要說明一下,四個域,域之間用逗号隔開,前三個域的内容必須填寫。第一個域是快捷鍵名稱,第二個域中0表示是檔案,其他任何非零數表示為目錄,第三個域就是快捷鍵的目标程式(目錄),第四個域是可選域,是安放快捷鍵的目錄,預設目錄就是[DestinationDirs]中 Shortcuts = "",你可以指定其他目錄,如你想在開始菜單 中加入自己的快捷鍵的話就在這裡寫上storage\windows\startmenu\。

最後需要說明的是文中的為了友善大家能看清楚,逗号都用全角表示,INF檔案涉及系統的東西是不能使用全角符号的,字元串我還沒有試過,不過我建議大家能使用英文盡量使用英文....

範本1,我自己寫的主題iMac的inf檔案

[Version]

Signature = "$Windows NT$"

Provider = "MGCN"

CESignature = "$Windows CE$"

[CEStrings]

AppName = "iMac"

[CEDevice.ARM720]

ProcessorType = 0

[SourceDisksNames]

1 =.

[SourceDisksFiles]

imac.home.xml = 1

alert.jpg = 1

app.jpg = 1

batterieoff.bmp = 1

batterieon.bmp = 1

BatteryMask.gif = 1

calendar.jpg = 1

call1.jpg = 1

call.jpg = 1

confirm.jpg = 1

contacts.jpg = 1

dial.jpg = 1

dialback.jpg = 1

error.jpg = 1

i1.gif = 1

i2.gif = 1

i3.gif = 1

i4.gif = 1

incall.jpg = 1

info.jpg = 1

kbat.ini = 1

kdh2.jpg = 1

newhome.jpg = 1

pro.jpg = 1

programs.jpg = 1

sm.jpg = 1

volume.jpg = 1

[DefaultInstall]

CopyFiles = CopyToHomeDir, CopyToiMacDir

AddReg = RegData

[DestinationDirs]

CopyToHomeDir = 0,%CE19%\Home

CopyToiMacDir = 0,%CE19%\Home\iMac

[CopyToHomeDir]

"iMac.home.xml",iMac.home.xml

[CopyToiMacDir]

"alert.jpg", alert.jpg

"app.jpg", app.jpg

"batterieoff.bmp", batterieoff.bmp

"batterieon.bmp", batterieon.bmp

"BatteryMask.gif", BatteryMask.gif

"calendar.jpg", calendar.jpg

"call1.jpg", call1.jpg

"call.jpg", call.jpg

"confirm.jpg", confirm.jpg

"contacts.jpg", contacts.jpg

"dial.jpg", dial.jpg

"dialback.jpg", dialback.jpg

"error.jpg", error.jpg

"i1.gif", i1.gif

"i2.gif", i2.gif

"i3.gif", i3.gif

"i4.gif", i4.gif

"incall.jpg", incall.jpg

"info.jpg", info.jpg

"kbat.ini", kbat.ini

"kdh2.jpg", kdh2.jpg

"newhome.jpg", newhome.jpg

"pro.jpg", pro.jpg

"programs.jpg", programs.jpg

"sm.jpg", sm.jpg

"volume.jpg", volume.jpg

[RegData]

HKLM,SOFTWARE\Microsoft\Shell\Rai\:CallAlert,BKBitmapFile,,"\Storage\Application Data\Home\iMac\call1.jpg"

HKLM,SOFTWARE\Microsoft\Shell\Rai\:ErrorBox,BKBitmapFile,,"\Storage\Application Data\Home\iMac\error.jpg"

HKLM,SOFTWARE\Microsoft\Shell\Rai\:ExclamationBox,BKBitmapFile,,"\Storage\Application Data\Home\iMac\alert.jpg"

HKLM,SOFTWARE\Microsoft\Shell\Rai\:InformationBox,BKBitmapFile,,"\Storage\Application Data\Home\iMac\info.jpg"

HKLM,Software\Microsoft\Shell\Rai\: QuestionBox,BKBitmapFile,,"\Storage\Application Data\Home\iMac\confirm.jpg"

HKLM,SOFTWARE\Microsoft\Shell\Rai\:VolDlg,BKBitmapFile,,"\Storage\Application Data\Home\iMac\volume.jpg"

HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSStart,BKBitmapFile,,"\Storage\Application Data\Home\iMac\programs.jpg"

HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSCPROG,BannerImage,,"\Storage\Application Data\Home\iMac\incall.jpg"

HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSCPROG,BKBitmapFile,,"\Storage\Application Data\Home\iMac\dialback.jpg"

HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSCdial,BannerImage,,"\Storage\Application Data\Home\iMac\dial.jpg"

HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSClog,BKBitmapFile,,"\Storage\Application Data\Home\iMac\programs.jpg"

HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSClog,BKFlags,0x00010001,26

HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSCONTACTS,BKBitmapFile,,"\Storage\Application Data\Home\iMac\contacts.jpg"

HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSCONTACTS,BKFlags,0x00010001,26

HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSSYNCAPP,BKBitmapFile,,"\Storage\Application Data\Home\iMacX\programs.jpg"

HKCU,ControlPanel\Home,Scheme,,"\Storage\Application Data\Home\iMac.home.xml"

HKCU,ControlPanel\Home,BgImage,,

HKCU,ControlPanel\Home,ColorScheme,,

範本2,e200插件的inf檔案[Version]

Signature = "$Windows NT$"

Provider = "Orange"

CESignature = "$Windows CE$" [CEStrings]

AppName = "E200's plugin"

[CEDevice.ARM720]

ProcessorType = 0[SourceDisksNames]

1 =. [SourceDisksFiles]

4orangeh.dll = 1

[DefaultInstall]

CopyFiles = CopyToHomeDir

AddReg = RegData[DestinationDirs]

CopyToHomeDir = 1,%CE19%\Home[CopyToHomeDir]

"4orangeh.dll",4orangeh.dll

[RegData]

HKCR,CLSID\{A2536C54-6AC2-4C31-9542-B144B0E9D077}\InprocServer32,,,"\Storage\Application Data\Home\4orangeh.dll"

HKCR,CLSID\{A2536C55-6AC2-4C31-9542-B144B0E9D077}\InprocServer32,,,"\Storage\Application Data\Home\4orangeh.dll"

HKCR,CLSID\{A2536C56-6AC2-4C31-9542-B144B0E9D077}\InprocServer32,,,"\Storage\Application Data\Home\4orangeh.dll"

HKCR,CLSID\{A2536C57-6AC2-4C31-9542-B144B0E9D077}\InprocServer32,,,"\Storage\Application Data\Home\4orangeh.dll"

HKCR,CLSID\{A2536C58-6AC2-4C31-9542-B144B0E9D077}\InprocServer32,,,"\Storage\Application Data\Home\4orangeh.dll"

HKCR,CLSID\{A2536C59-6AC2-4C31-9542-B144B0E9D077}\InprocServer32,,,"\Storage\Application Data\Home\4orangeh.dll"

HKCR,CLSID\{A2536C5B-6AC2-4C31-9542-B144B0E9D077}\InprocServer32,,,"\Storage\Application Data\Home\4orangeh.dll"

http://msdn.microsoft.com/en-us/library/aa924371.aspx

http://www.devdiv.net/viewthread.php?tid=1594&extra=page%3D1

本文來自CSDN部落格,轉載請标明出處:http://blog.csdn.net/okadler0518/archive/2009/06/02/4235835.aspx