1、如果需要創(chuàng )建cab文件,首先需要Cabarc或者M(jìn)akecab,它們隨著(zhù)Cabinet SDK的安裝就有了,Cabinet SDK的下載地址是http://msdn.microsoft.com/workshop/management/cab/cabdl.asp。
Cabarc可以創(chuàng )建、查看或者解出cab里面的文件,而Makecab則只可以用來(lái)創(chuàng )建cab文件。
2、制作cab文件時(shí)需要將所有的相關(guān)文件都包含進(jìn)去,可以通過(guò)Depends(VC自帶的)檢查需要的文件。使用inf文件將這些東西都寫(xiě)進(jìn)去。
3、inf搞法:inf文件描述cab中所有的ocx及dll文件,inf通過(guò)一些命名區域來(lái)提供需要的信息。
怎么寫(xiě)inf
最開(kāi)始一般是[Version]區:
eg: [Version]
signature="$XXXX$"
AdvancedINF=2.0
接下來(lái)就是最重要的[Add.Code]區:
eg: [Add.Code]
Ctrl1.dll=C1Section
Ctrl2.dll=Ctrl2.dll
前面是要下載的文件名,后面是對應這個(gè)文件的區域名,可以是任何名字,不過(guò)一般都是和文件的名字相同,這樣方便維護。還有需要注意是在[Add.Code]區出現的文件要根據依賴(lài)性進(jìn)行排序,例如前面說(shuō)的ctrl1.dll要依賴(lài)于ctrl2.dll,則ctrl2.dll要出現在ctrl1.dll的前面。因為安裝時(shí)是按照相反的順序進(jìn)行的,也就是說(shuō)先安裝ctrl2.dll,然后才是ctrl1.dll,哧哧,記清楚了,不要搞反了。
再接下來(lái)是各個(gè)文件的區域了
[Ctrl1.dll]
file-win32-x86=thiscab
RegisterServer=yes
clsid={.....}
DestDir=
FileVersion=1,0,0,0
[Ctrl1.dll]區域中的第一個(gè)file值告訴ie到哪里去得到這個(gè)dll,file一共包括三個(gè)部分,第一部分是file,這個(gè)永遠都是這樣的(至少目前來(lái)說(shuō));第二部分告訴聲明支持的OS,win32表示windows,mac就是蘋(píng)果MAC OX了;第三部分是CPU類(lèi)型,比如說(shuō)x86、 ppc (Power PC)、 mips或者alpha了。
file的值可以取三個(gè)一個(gè)URL、ignore和thiscab,如果是URL則說(shuō)明到URL所在的位置去下;如果是ignore說(shuō)明對于這種OS和CPU,不需要下載這個(gè)文件(ctrl1.dll);如果是thiscab很明顯就在當前的cab文件中了。
接下來(lái)是RegisterServer,可以取兩個(gè)值yes和no,如果為yes則說(shuō)明ie要注冊該dll,如果是no就不必了;
再下來(lái)是DestDir,它的值是dll將要存到本地硬盤(pán)的位置,如果它的值是10,則將dll放到\Windows或者\WinNT下;如果是11,則放到\Windows\System或者
\WinNT\System32下;如果是空(就是沒(méi)有值)則會(huì )放到\Windows或者\WinNT下的Downloaded Program Files目錄下;
最后是FileVersion,這個(gè)就比較明顯了,說(shuō)明了ctrl1.dll的版本號。
有時(shí)候我們使用VB來(lái)開(kāi)發(fā)控件的時(shí)候,需要將VB的虛擬機裝上去,它需要一些其它的說(shuō)明的,簡(jiǎn)單地講一下吧:
在[Add.Code]中增加一項MSVBVM60.DLL=MSVBVM60.DLL(以VB6為例)下面是
MSVBVM60.DLL區域:
[MSVBVM60.DLL]
hook=MSVBVM60.cab_Installer
FileVersion=6,0,81,76
FileVersion很明顯,是版本號,就不再說(shuō)發(fā),就說(shuō)說(shuō)hook吧。
hook區域是在安裝的時(shí)候需要執行的區域,它分為兩種,一種是有條件的,另外一種是無(wú)條件的,無(wú)條件的hook區域是必須執行的,反之則根據條件判斷是否執行。以[Setup Hooks]標記的區域是無(wú)條件區域,如下所示
[Setup Hooks]
hookname=section-name
[section-name]
run=%EXTRACT_DIR%\setup.exe
無(wú)條件區域常用來(lái)通過(guò)一個(gè)inf文件執行一個(gè)安裝程序,這就是我們在資源管理器右鍵點(diǎn)擊一個(gè)inf文件時(shí)在執行安裝這樣的菜單的原因了
當ie下載了一個(gè)cab文件,如果文件中沒(méi)有[Add.Code],則處理[Setup Hooks]區域,運行run所指定程序,哧哧,上面就是setup.exe;
條件區域則為在一定條件下執行,前面為MSVBVM60.DLL指定的hook區域就是一個(gè)條件區域,如果在MSVBVM60.DLL指定的CLSID或者version不能滿(mǎn)足需要而且沒(méi)有file這個(gè)命名值,則執行hook所指定的區域。
[MSVBVM60.cab_Installer]
file-win32-x86=http://activex.microsoft.com/controls/vb6/VBRun60.cab
run=%EXTRACT_DIR%\VBRun60.exe
上面[MSVBVM60.cab_Installer]是一個(gè)hook區域,它也包含了一個(gè)file值,指定一個(gè)URL,表示MSVBVM60.DLL可以從這個(gè)URL下載得到;run則說(shuō)明了執行哪一個(gè)文件
這里有必要說(shuō)明一下的是,MS對一些常用的Redistributable Microsoft DLLs
可以通過(guò)指定CODEBASE屬性為http://activex.microsoft.com/controls,這樣在cab文件中就中需要包含這些文件,在計算機上有一個(gè)文件redist.txt上面的dll就是Redistributable Microsoft DLLs
創(chuàng )建一個(gè)cab文件:
cabarc N ctrl1.cab ctrl1.inf ctrl1.dll
N表示要創(chuàng )建一個(gè)新的文件,ctrl1.cab是創(chuàng )建的文件名,ctrl1.inf是cab的inf,后而是需要加到cab里的文件,可以使用通配符。
然后就可以將cab文件放到網(wǎng)頁(yè)上了
<OBJECT ID="Ctrl1Obj"
CLASSID="clsid:....................................."
CODEBASE="http://server.com/ctrl1.cab#version=8,0,0,5007">
</OBJECT>
這里也在一個(gè)version,不過(guò)這里的version是指控件的version,而inf里的是文件的version。
制作電子簽名:
首先從下面的網(wǎng)址下載制作簽名的工具SignCode,地址是
http://msdn.microsoft.com/workshop/gallery/tools/authenticode/authcode.asp
從簽名授權中心如VeriSign或者你的局域網(wǎng)上運行的Microsoft Certificate
Server授權服務(wù)器得到一個(gè)certificate,在申請授權的過(guò)程你會(huì )得到一個(gè)私鑰。
也可以使用MakeCert.exe和Cert2Spc.exe創(chuàng )建的私鑰進(jìn)行測試,方法是首先使用MakeCert創(chuàng )建一個(gè)X.509的certificate(.cer文件)
MakeCert -sv MyKey.pvk n "CN=My Software Company" MyCert.cer
然后利用Cert2Spc將.cer文件轉換成為PKCS #7軟件發(fā)布Certificate(.spc文件),
Cert2Spc MyCert.cer MyCert.spc
利用你下載的SignCode對你的cab文件進(jìn)行電子簽名
SignCode -spc MyCert.spc -v MyKey.pvk -t http://
timestamp.verisign.com/scripts/timstamp.dll ctrl1.cab
SignCode還可以指定一些其它的參數,就不說(shuō)了,太長(cháng)了,哧哧。
雖然可以利用測試的.cer和.spc文件,但是在發(fā)布的時(shí)候,必須申請。
其實(shí)東西在SDK中都有說(shuō)明,不過(guò)都是E文的,慢慢看.
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。