摘自:http://blog.csdn.net/dotnet_editor/archive/2005/08/19/459018.aspx
本文來(lái)自《msdn開發(fā)精選》雜志2005年第4期“特別策劃”欄目
當(dāng)我們開發(fā)完P(guān)ocket PC或者Smartphone的軟件后,都需要考慮如何制作給最終用戶使用的軟件安裝包。專門用于制作安裝包的軟件有很多,如Install Shield等。但在許多情況下,我們僅僅需要一些比較簡(jiǎn)單的安裝過(guò)程,這時(shí)候我們完全可以利用SDK中提供的工具和一些免費(fèi)的軟件來(lái)制作安裝包。另外,我們制作的軟件經(jīng)常會(huì)需要在不同的平臺(tái)下運(yùn)行,例如筆者開發(fā)的一個(gè)軟件同時(shí)支持HPC,PPC,Smartphone等平臺(tái),HPC和PPC平臺(tái)上還有3種CPU類型。如果每一步操作完成后都需要人工介入進(jìn)行操作的話,每一次構(gòu)建過(guò)程都會(huì)相當(dāng)?shù)姆爆嵑秃臅r(shí)。所以我們會(huì)考慮如何將一系列的操作采用腳本串接起來(lái),只需要運(yùn)行一個(gè)命令就能夠生成最終需要的所有安裝包。
用命令行編譯鏈接程序
雖然EVC里提供了Batch Build的功能,但該功能只能用于同一平臺(tái)的不同CPU版本的編譯鏈接操作。在切換不同平臺(tái)進(jìn)行編譯時(shí),需要在GUI環(huán)境中手工執(zhí)行,無(wú)法達(dá)到我們要求。所以我們需要研究如何在命令行狀態(tài)下進(jìn)行程序的編譯運(yùn)行。實(shí)際上EVC程序本身是提供了一系列的命令可以用于命令行編譯的。
D:\Program Files\Microsoft eMbedded Tools\Common\EVC\Bin>evc /?
Usage:
EVC [myprj.vcp|mywksp.vcw] - load project/workspace
[<filename>] - load source file
/? - display usage information
/EX <macroname> - execute a VBScript macro
/OUT <filename> - redirect command line output to a file
/USEENV - ignore tools.options.directories settings
/MAKE [<target>] [...] - build specified target(s)
[<project> - <platform> <configname>]
[[<project>|ALL] - [DEBUG|RELEASE|ALL]]
/CLEAN - delete intermediate files but don't build
/REBUILD - clean and build
/NORECURSE - don't build dependent projects
/CECONFIG [<configuration>] - use specified configuration
其中主要是運(yùn)用MAKE命令。假設(shè)我們需要編譯的程序名叫做Demo,工作環(huán)境文件名為demo.vcw,PPC版的工程項(xiàng)目文件為Demo.vcp,Smartphone版本的項(xiàng)目文件為DemoSP.vcp.我們?yōu)镋VC3編寫好的批處理文件build.bat如下:
REM @echo off
set EVC="D:\Program Files\Microsoft eMbedded Tools\Common\EVC\Bin\EVC.EXE" <-指向EVC 3.0程序所在目錄
set CFG=
set CECONFIG=
%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild <-執(zhí)行編譯并生成目標(biāo)可執(zhí)行文件
if errorlevel 1 goto :eof <-如果編譯失敗則終止批處理
:pocketpc
set CFG=Demo - Win32 (WCE ARM) Release<-將要進(jìn)行編譯的項(xiàng)目名稱和編譯出來(lái)的目標(biāo)代碼的平臺(tái)和CPU類型。其中“-”前面的是項(xiàng)目名稱,“-”后面的部分是平臺(tái)和CPU類型以及編譯的是Release版還是Debug版。格式可以參照在EVC的Build->Configurations中的寫法, EVC3 和 EVC4的表達(dá)方式略有不同。
set CECONFIG="Pocket PC" <-編譯PPC平臺(tái)版本
%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild
if errorlevel 1 goto :eof
set CFG=Demo - Win32 (WCE MIPS) Release
%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild
if errorlevel 1 goto :eof
set CFG=Demo - Win32 (WCE SH3) Release
%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild
if errorlevel 1 goto :eof
:sp2002
set CFG=DemoSP - Win32 (WCE ARM) Release
set CECONFIG="Smartphone 2002" <-編譯Smartphone平臺(tái)版本
%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild
if errorlevel 1 goto :eof
echo build successfully finished!!
pause
根據(jù)上面的代碼,現(xiàn)在我們只需要運(yùn)行一次build.bat文件即可編譯生成PPC,Smartphone等不同平臺(tái)的目標(biāo)文件。
制作cab文件
生成目標(biāo)文件后,我們就需要考慮如何將程序安裝到設(shè)備上。cab文件是一種壓縮并且?guī)в懈鞣N安裝信息的打包文件,所有的安裝軟件實(shí)際上都是將軟件的cab文件拷貝到相應(yīng)設(shè)備上,然后利用設(shè)備上的wceload程序進(jìn)行最后的設(shè)備安裝步驟。我們可以使用PocketPC或者Smartphone SDK中附帶的cabwiz.exe (在Smartphone上是CabWizSP.exe)對(duì)程序進(jìn)行打包生成cab文件。
在制作cab文件之前,我們通常需要做好以下的規(guī)劃:
- 程序的詳細(xì)信息,例如公司名稱,程序名稱等等
- 目標(biāo)的硬件平臺(tái),如PPC還是Smartphone,什么類型的CPU
- 有哪些源文件,源文件存放在PC機(jī)上面的什么目錄中
- 拷貝到設(shè)備上的文件存放在什么路徑下
- 是否需要?jiǎng)?chuàng)建快捷方式,快捷方式到什么文件,圖標(biāo)是什么
- 是否需要修改注冊(cè)表,修改項(xiàng)目和內(nèi)容是什么
cab文件的生成需要制作一個(gè).inf文件作為cabwiz程序的輸入。當(dāng)我們做好計(jì)劃之后就可以動(dòng)手編寫這個(gè).inf文件。這個(gè)文件是整個(gè)制作過(guò)程中最關(guān)鍵的一步,也是最困難的一步。.inf文件與windows里的ini文件十分相似,都是用文本方式保存的,里面包含若干的段(Section), 關(guān)鍵字(Key)和值(Value)組成的描述信息。我們同樣是采用對(duì)例子進(jìn)行解釋說(shuō)明的方式進(jìn)行介紹。
一般來(lái)說(shuō),inf文件都有四個(gè)主要組成部分,PPC的寫法和Smartphone的寫法略有不同,我們先介紹PPC的寫法。
inf文件的第一部分是一些全局信息的定義:
[Version] <-版本信息,必須有該段
Signature = "$Windows NT$" <-必須是$Windows NT$或者$Windows 98$, 不要改動(dòng)
Provider = "Demo Soft" <-提供商, 完整的程序名字會(huì)是"<Provider> <AppName>"
CESignature = "$Windows CE$" <-必須是該值
[CEStrings] <-該段主要是定義安裝程序用到的一些字符串,必須有該段
AppName = "DemoApp" <-程序的名字
InstallDir = “%CE1%\Octopus Studio\%AppName%” <-定義程序在目標(biāo)設(shè)備中的安裝目錄
[Strings] <-該段用于用戶自己定義的字符串, 該段可選
ExeBaseDir = "C:\ProjectHome\demo\Release\platform" <-和平臺(tái)相關(guān)的文件放在這個(gè)目錄下
CommonDir = "C:\ProjectHome\demo\Release" <-與平臺(tái)無(wú)關(guān)的文件放在這個(gè)目錄里
其中InstallDir中出現(xiàn)的“%CE1%”是inf文件定義的系統(tǒng)目錄標(biāo)記,下面列出的是PPC 2002和Smartphone 2002下可以使用的目錄宏:
目錄標(biāo)記 |
目錄路徑 |
%CE1% |
\Program Files |
%CE2% |
\Windows |
%CE4% |
\Windows\StartUp |
%CE5% |
\My Documents |
%CE8% |
\Program Files\Games |
%CE11% |
\Windows\Start Menu\Programs |
%CE14% |
\Windows\Start Menu\Programs\Games |
%CE15% |
\Windows\Fonts |
%CE17% |
\Windows\Start Menu |
%CE19% |
\Application Data(僅用于Smartphone) |
這些目錄標(biāo)記在進(jìn)行安裝的時(shí)候會(huì)替換成相應(yīng)的系統(tǒng)目錄路徑。此外這些系統(tǒng)目錄在安裝過(guò)程中會(huì)自動(dòng)根據(jù)需要進(jìn)行自動(dòng)調(diào)節(jié)。例如%CE1%是指系統(tǒng)缺省的程序安裝目錄,指向“\Program Files”。而當(dāng)用戶選擇程序安裝在存儲(chǔ)卡中時(shí),該目錄也會(huì)做相應(yīng)改變。
[CEString]和[Strings]中定義的變量以及上面提到的目錄標(biāo)記可以用于替換inf文件中的任意部分。下面的說(shuō)明中會(huì)有使用的例子。
第二部分是用來(lái)聲明支持的設(shè)備CPU類型,操作系統(tǒng)類型和版本號(hào)要求:
[CEDevice.ARM] <-目標(biāo)設(shè)備聲明,如果支持多種設(shè)備/CPU就會(huì)有多個(gè)CEDevice段,并且在用設(shè)備標(biāo)號(hào)作為后綴表示。如果只支持一種設(shè)備,可以直接用[CEDevice]表示
ProcessorType = 2577 <-該目標(biāo)設(shè)備是StrongARM CPU
UnsupportedPlatforms = “Smartphone”,"HPC","Jupiter","Palm PC2" <-不支持smarthphone和HPC等舊設(shè)備
VersionMin = 3.00 <-對(duì)應(yīng)設(shè)備德操作系統(tǒng)的最低版本號(hào)要求是3.0,版本號(hào)說(shuō)明見下面的說(shuō)明
VersionMax = 5.00 <-假設(shè)我們的程序要求的操作系統(tǒng)最高版本號(hào)是5.0
[CEDevice.MIPS]
ProcessorType = 4000 <-CPU要求是 MIPS_R4000
UnsupportedPlatforms = “Smartphone”,"HPC","Jupiter","Palm PC2"
VersionMin = 3.00
VersionMax = 5.00
[CEDevice.SH3]
ProcessorType = 10003 <- CPU要求是 Hitachi_SH3
UnsupportedPlatforms = “Smartphone”,"HPC","Jupiter","Palm PC2"
VersionMin = 3.00
VersionMax = 5.00
WinCE各個(gè)平臺(tái)的表示法和相應(yīng)的版本號(hào)如下表,UnsupportedPlatform和VersionMin/VersionMax的值可以參考該表進(jìn)行填寫。
Platform |
Platform type |
Windows CE version |
Smartphone 2003 |
Smartphone |
4.2 |
Smartphone 2002 |
Smartphone |
3.0 |
Pocket PC 2003 |
Pocket PC |
4.2 |
Pocket PC 2002 |
Pocket PC |
3.0 |
Pocket PC 2000 |
Palm PC2 |
3.0 |
Palm Size PC v2 |
Palm PC |
2.11 |
Palm Size PC v1 |
Palm PC |
2.1 |
Handheld PC 2000 |
Jupiter |
3.0 |
Handheld PC Pro |
Jupiter |
2.11 |
Handheld PC |
HPC |
2.0 |
inf文件的第三部分是定義源文件的組成和其在桌面機(jī)器的目錄:
[SourceDisksNames] <-源文件所在目錄,段名稱不加后綴表示與平臺(tái)無(wú)關(guān)的文件所在目錄.必須有該段
1=, "SourceDisk01",,%CommonDir% <-格式為 <source ID> = ,<label>,,<source directory>其中Source ID用來(lái)在后續(xù)內(nèi)容中指定源文件目錄用,label只是說(shuō)明,無(wú)用處。Source directory則是指源文件在PC系統(tǒng)中的所在目錄。
[SourceDisksNames.ARM] <-段名稱的后綴與前面的CEDevice段相對(duì)應(yīng)
2=, "SourceDisk02",,%ExeBaseDir%\ppc\arm
[SourceDisksNames.MIPS]
2=, "SourceDisk03",,%ExeBaseDir%\ppc\mips
[SourceDisksNames.SH3]
2=, "SourceDisk04",,%ExeBaseDir%\ppc\sh3
[SourceDisksFiles] <-說(shuō)明源文件分別放在什么目錄下,必須有該段
"demo.htm" = 1 <- 格式為<filename> = <source ID>,其中filename是文件名,Source ID是指上面SourceDiskName中定義的源目錄ID.“demo.htm”=1表示demo.htm文件是放在SourceDiskNames里定義的%CommonDir%目錄里。
"demo.exe" = 2
"demo.dll" = 2
inf文件的第四部分是定義安裝的操作
[DefaultInstall] <-指明安裝包需要進(jìn)行的操作,例如文件拷貝,快捷方式創(chuàng)建等。必須有該段
CopyFiles = Files.InstallDir, Files.Windows <-指明需要進(jìn)行文件拷貝的說(shuō)明段,參看下面的說(shuō)明
CEShortcuts = Links <-指定需要生成的快捷方式定義. 除了這連個(gè)安裝操作外,開發(fā)人員還可以指定注冊(cè)表修改(AddReg), 自定的安裝/卸載時(shí)的可執(zhí)行代碼(CESetupDLL), 注冊(cè)DLL文件(CESelfRegister).具體可以參考SDK幫助文件
[Files.InstallDir] <-文件拷貝操作中指明的文件拷貝操作定義,用于定義每個(gè)文件如何被拷貝到設(shè)備上
"demo.htm",,,0x40000001 <- 格式為<dest filename>,<source filename>,,<copy flags>, 其中dest filename 表示拷貝到目標(biāo)設(shè)備后文件名; source filename源文件的文件名,如果為空則dest filename用來(lái)表示源文件文件名;copy flags表示拷貝文件時(shí)的方式,該值是一些標(biāo)志位的組合,可用的標(biāo)志如下:
標(biāo)志 |
含義 |
0x00000001 |
警告用戶如果在拷貝該文件時(shí)發(fā)生錯(cuò)誤, 而用戶采用跳過(guò)操作的話 |
0x00000002 |
不允許用戶在拷貝該文件時(shí)發(fā)生錯(cuò)誤才取跳過(guò)操作 |
0x00000010 |
當(dāng)目標(biāo)目錄中有同名文件存在時(shí)不進(jìn)行覆蓋操作 |
0x00000400 |
當(dāng)目標(biāo)目錄存在同名文件時(shí)才進(jìn)行拷貝(覆蓋)操作 |
0x20000000 |
如果目標(biāo)文件比該文件新則不進(jìn)行拷貝操作 |
0x40000000 |
拷貝文件時(shí)不檢查文件日期 |
0x80000000 |
創(chuàng)建一個(gè)對(duì)該文件的鏈接,主要是用于共享dll文件 |
"demo.exe",,,0x40000003
[Files.Windows] <-同上,用戶定義文件拷貝操作
"demo.dll",,,0x80000013
[DestinationDirs] <-定義設(shè)備上的目標(biāo)文件目錄
Files.InstallDir = 0,%InstallDir% <- 格式為<section name> = 0,<dest directory>, 其中section name 對(duì)應(yīng)[DefaultInstall] CopyFiles中的值。dest directory則是目標(biāo)設(shè)備上的目的目錄。例如Files.InstallDir里列出的文件將會(huì)拷貝到目標(biāo)設(shè)備的%InstallDir%目錄下。
Files.Windows = 0, %CE2%
Links = 0, %CE11%
[Links] <- 該段對(duì)應(yīng)[DefaultInstall]中CEShortcuts的定義,用來(lái)說(shuō)明需要?jiǎng)?chuàng)建的快捷方式
%AppName%,0,"demo.exe",%CE11% <- 格式為<shortcut filename>,<shortcut type>,<target file/path>,<standard dest path>。其中 shortcut filename是指生成的快捷方式的文件名; shortcut type 指明鏈接的是文件名還是目錄,0表示文件,非0表示目錄; target file/path 是指被鏈接的文件的文件名或者目錄路徑; standard dest path 指快捷方式存放在那個(gè)目錄下。
以上是針對(duì)PPC的inf文件寫法。由于PPC支持多種的CPU所以比較復(fù)雜一些,而Smartphone目前實(shí)際上目前只支持一種CPU類型,所以我們可以對(duì)inf文件進(jìn)行簡(jiǎn)化。其中文件的第1和第4部分的內(nèi)容還是和PPC一樣。而第2和第3部分則可以簡(jiǎn)化成:
[CEDevice]
ProcessorType = 2577
UnsupportedPlatforms = “Pocket PC“,"HPC","Jupiter","Palm PC2" <-不支持PPC和HPC等設(shè)備
VersionMin = 3.00
VersionMax = 5.00
[SourceDisksNames]
1=, "SourceDisk01",,%CommonDir%
2=, "SourceDisk02",,%ExeBaseDir%\sp
[SourceDisksFiles]
"demo.htm" = 1
"demo.exe" = 2
"demo.dll" = 2
把以上四個(gè)部分拼成一個(gè)文件就是一個(gè)完整的inf文件了。制作完inf文件后,我們就可以使用cabwiz.exe文件來(lái)生成.cab文件。該命令的語(yǔ)法如下:
cabwiz.exe "inf_file"
[/dest dest_directory]
[/err error_file]
[/cpu cpu_type [cpu_type]]
參數(shù)的含義為:
inf_file – 指向inf文件的全路徑
dest_directory – 生成的cab文件的存放路徑,如不指定則生成在inf文件所在目錄
error_file – 錯(cuò)誤報(bào)告文件,將所有的執(zhí)行信息都輸出到該文件。不指定該參數(shù)時(shí),所有的錯(cuò)誤信息都會(huì)用消息框來(lái)顯示。該參數(shù)主要用于自動(dòng)化構(gòu)建
cpu_type – 指定需要生成的CPU類型,需要與inf文件中定義的CEDevice段的后綴一致。可以同時(shí)指定多個(gè)CPU類型
假設(shè)我們前面例子中的inf文件名為demo.inf文件。則對(duì)應(yīng)的執(zhí)行命令為:
cabwiz demo.inf /err buildppc.err /cpu ARM MIPS SH3
這樣就會(huì)生成 demo.arm.cab, demo.mips.cab, demo.sh3.cab 三個(gè)文件,分別對(duì)應(yīng)3種不同的CPU(平臺(tái))的安裝文件。
制作自動(dòng)安裝執(zhí)行文件
生成了cab文件并不意味著大功告成。雖然用戶可以手工將cab文件拷貝到設(shè)備上安裝,但這樣需要用戶自己懂得區(qū)分CPU類型等許多的專業(yè)知識(shí)。所以我們通常都會(huì)進(jìn)一步生成一個(gè)可執(zhí)行的自動(dòng)化安裝包,達(dá)到傻瓜化安裝的目的。如果你的安裝過(guò)程比較簡(jiǎn)單的話,可以使用Spb Software House(http://www.spbsoftwarehouse.com)公司提供的免費(fèi)軟件ezsetup進(jìn)行可執(zhí)行安裝文件的制作。該軟件生的安裝程序功能比較簡(jiǎn)單:顯示產(chǎn)品信息和軟件授權(quán)協(xié)議,然后安裝cab文件。雖然功能比較少,但大部分的PPC/Smartphone軟件的安裝過(guò)程也只需要這幾個(gè)功能就足夠了。
首先我們需要制作一個(gè)demo.ini文件。該文件的格式很簡(jiǎn)單,PPC和Smartphone對(duì)應(yīng)的格式都一樣。例子如下:
[CEAppManager]
Version = 1.0 <- 這個(gè)是CeAppMgr程序的版本號(hào),不是要安裝的軟件的版本號(hào),不必修改
Component = Demo <- 軟件的模塊,與下面的段的名稱一致
[Demo]
Description = Demo App For PPC <- 軟件的描述
CabFiles = demo.arm.cab,demo.mips.cab,demo.sh3.cab <-列出需要所有的cab文件,注意文件名之間不要有空格
ezsetup程序是一個(gè)命令行運(yùn)行的程序,這可以方便我們進(jìn)行自動(dòng)化構(gòu)建。命令的使用方法如下:
ezsetup <-l language> <-i inifilename> <-r readme.txt>
<-e eula.txt> <-o outputexe>
-l language 是指定安裝過(guò)程中使用的語(yǔ)言,暫時(shí)不支持中文,所以我們選English
-i inifilename ini文件的全路徑
-r readme.txt readme文件的全路徑,用于在安裝過(guò)程中顯示給用戶
-e eula.txt最終用戶授權(quán)協(xié)議文件的全路徑,用于安裝過(guò)程中授權(quán)協(xié)議界面的顯示
-o outputexe 生成的exe文件的名稱
我們可以用下面的命令來(lái)生成可執(zhí)行安裝文件:
ezsetup -l english -i demo.ini -r Readme.txt -e License.txt -o demo_setup.exe
自動(dòng)化構(gòu)建
前面分別介紹了如何在命令行編譯鏈接目標(biāo)程序,制作cab文件,以及生成自動(dòng)化安裝程序。這些步驟都是可以通過(guò)命令行方式執(zhí)行的,所以我們可以把這些命令在批處理腳本中串接起來(lái)制作自動(dòng)化構(gòu)建腳本。這樣我們就可以“一鍵”完成從代碼編譯到生成最終可執(zhí)行安裝包的全過(guò)程。
posted on 2009-04-23 18:40
Sandy 閱讀(287)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
Window Mobile