• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            春暖花開
            雪化了,花開了,春天來(lái)了
            posts - 149,comments - 125,trackbacks - 0
            摘自:http://blog.csdn.net/dotnet_editor/archive/2005/08/19/459018.aspx

              本文來(lái)自《msdn開發(fā)精選》雜志2005年第4期“特別策劃”欄目

            作者:RAYMAN

              當(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
            九九热久久免费视频| 日韩久久无码免费毛片软件| 久久精品国产一区二区三区| 99久久精品九九亚洲精品| 日本免费久久久久久久网站| 国产成人精品久久亚洲高清不卡 | 精品乱码久久久久久久| 亚洲av成人无码久久精品| av色综合久久天堂av色综合在| 精品久久久无码21p发布| 亚洲国产一成人久久精品| 久久久久久精品久久久久| 18岁日韩内射颜射午夜久久成人| 久久男人AV资源网站| 99精品久久精品一区二区| 东方aⅴ免费观看久久av| 性欧美丰满熟妇XXXX性久久久| 亚洲日本va中文字幕久久| 人妻精品久久无码区| 狠狠色丁香婷婷综合久久来来去 | 国产成人精品久久综合| 国产婷婷成人久久Av免费高清| 91精品无码久久久久久五月天| 亚洲综合婷婷久久| 精品久久综合1区2区3区激情| 欧美午夜A∨大片久久| 久久久久久综合网天天| 97久久综合精品久久久综合| 亚洲国产成人精品91久久久| 久久精品免费一区二区| 久久国产精品99久久久久久老狼| 久久精品国产免费观看| 亚洲精品乱码久久久久久自慰| 狠狠色丁香久久婷婷综合五月| 色综合久久久久| 久久久久久久97| 久久99久久99小草精品免视看| 久久人人添人人爽添人人片牛牛| 青青国产成人久久91网| 91精品日韩人妻无码久久不卡| 久久午夜伦鲁片免费无码|