• <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>
            春暖花開
            雪化了,花開了,春天來了
            posts - 149,comments - 125,trackbacks - 0
            摘自:http://blog.csdn.net/dotnet_editor/archive/2005/08/19/459018.aspx

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

            作者:RAYMAN

              當(dāng)我們開發(fā)完P(guān)ocket PC或者Smartphone的軟件后,都需要考慮如何制作給最終用戶使用的軟件安裝包。專門用于制作安裝包的軟件有很多,如Install Shield等。但在許多情況下,我們僅僅需要一些比較簡單的安裝過程,這時(shí)候我們完全可以利用SDK中提供的工具和一些免費(fèi)的軟件來制作安裝包。另外,我們制作的軟件經(jīng)常會需要在不同的平臺下運(yùn)行,例如筆者開發(fā)的一個(gè)軟件同時(shí)支持HPC,PPC,Smartphone等平臺,HPC和PPC平臺上還有3種CPU類型。如果每一步操作完成后都需要人工介入進(jìn)行操作的話,每一次構(gòu)建過程都會相當(dāng)?shù)姆爆嵑秃臅r(shí)。所以我們會考慮如何將一系列的操作采用腳本串接起來,只需要運(yùn)行一個(gè)命令就能夠生成最終需要的所有安裝包。

            用命令行編譯鏈接程序

              雖然EVC里提供了Batch Build的功能,但該功能只能用于同一平臺的不同CPU版本的編譯鏈接操作。在切換不同平臺進(jìn)行編譯時(shí),需要在GUI環(huán)境中手工執(zhí)行,無法達(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)目名稱和編譯出來的目標(biāo)代碼的平臺和CPU類型。其中“-”前面的是項(xiàng)目名稱,“-”后面的部分是平臺和CPU類型以及編譯的是Release版還是Debug版。格式可以參照在EVC的Build->Configurations中的寫法, EVC3 和 EVC4的表達(dá)方式略有不同。
            set CECONFIG="Pocket PC" <-編譯PPC平臺版本
            %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平臺版本
            %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等不同平臺的目標(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)對程序進(jìn)行打包生成cab文件。

              在制作cab文件之前,我們通常需要做好以下的規(guī)劃:

            • 程序的詳細(xì)信息,例如公司名稱,程序名稱等等
            • 目標(biāo)的硬件平臺,如PPC還是Smartphone,什么類型的CPU
            • 有哪些源文件,源文件存放在PC機(jī)上面的什么目錄中
            • 拷貝到設(shè)備上的文件存放在什么路徑下
            • 是否需要創(chuàng)建快捷方式,快捷方式到什么文件,圖標(biāo)是什么
            • 是否需要修改注冊表,修改項(xiàng)目和內(nèi)容是什么

              cab文件的生成需要制作一個(gè).inf文件作為cabwiz程序的輸入。當(dāng)我們做好計(jì)劃之后就可以動手編寫這個(gè).inf文件。這個(gè)文件是整個(gè)制作過程中最關(guān)鍵的一步,也是最困難的一步。.inf文件與windows里的ini文件十分相似,都是用文本方式保存的,里面包含若干的段(Section), 關(guān)鍵字(Key)和值(Value)組成的描述信息。我們同樣是采用對例子進(jìn)行解釋說明的方式進(jìn)行介紹。

              一般來說,inf文件都有四個(gè)主要組成部分,PPC的寫法和Smartphone的寫法略有不同,我們先介紹PPC的寫法。

              inf文件的第一部分是一些全局信息的定義:

            [Version] <-版本信息,必須有該段
            Signature = "$Windows NT$" <-必須是$Windows NT$或者$Windows 98$, 不要改動
            Provider = "Demo Soft" <-提供商, 完整的程序名字會是"<Provider> <AppName>"
            CESignature = "$Windows CE$" <-必須是該值

            [CEStrings] <-該段主要是定義安裝程序用到的一些字符串,必須有該段
            AppName = "DemoApp" <-程序的名字
            InstallDir = “%CE1%\Octopus Studio\%AppName%” <-定義程序在目標(biāo)設(shè)備中的安裝目錄

            [Strings] <-該段用于用戶自己定義的字符串, 該段可選
            ExeBaseDir = "C:\ProjectHome\demo\Release\platform" <-和平臺相關(guān)的文件放在這個(gè)目錄下
            CommonDir = "C:\ProjectHome\demo\Release" <-與平臺無關(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í)候會替換成相應(yīng)的系統(tǒng)目錄路徑。此外這些系統(tǒng)目錄在安裝過程中會自動根據(jù)需要進(jìn)行自動調(diào)節(jié)。例如%CE1%是指系統(tǒng)缺省的程序安裝目錄,指向“\Program Files”。而當(dāng)用戶選擇程序安裝在存儲卡中時(shí),該目錄也會做相應(yīng)改變。

              [CEString]和[Strings]中定義的變量以及上面提到的目錄標(biāo)記可以用于替換inf文件中的任意部分。下面的說明中會有使用的例子。

              第二部分是用來聲明支持的設(shè)備CPU類型,操作系統(tǒng)類型和版本號要求:

            [CEDevice.ARM] <-目標(biāo)設(shè)備聲明,如果支持多種設(shè)備/CPU就會有多個(gè)CEDevice段,并且在用設(shè)備標(biāo)號作為后綴表示。如果只支持一種設(shè)備,可以直接用[CEDevice]表示
            ProcessorType = 2577 <-該目標(biāo)設(shè)備是StrongARM CPU
            UnsupportedPlatforms = “Smartphone”,"HPC","Jupiter","Palm PC2" <-不支持smarthphone和HPC等舊設(shè)備
            VersionMin = 3.00 <-對應(yīng)設(shè)備德操作系統(tǒng)的最低版本號要求是3.0,版本號說明見下面的說明
            VersionMax = 5.00 <-假設(shè)我們的程序要求的操作系統(tǒng)最高版本號是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è)平臺的表示法和相應(yīng)的版本號如下表,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] <-源文件所在目錄,段名稱不加后綴表示與平臺無關(guān)的文件所在目錄.必須有該段
            1=, "SourceDisk01",,%CommonDir% <-格式為 <source ID> = ,<label>,,<source directory>其中Source ID用來在后續(xù)內(nèi)容中指定源文件目錄用,label只是說明,無用處。Source directory則是指源文件在PC系統(tǒng)中的所在目錄。

            [SourceDisksNames.ARM] <-段名稱的后綴與前面的CEDevice段相對應(yīng)
            2=, "SourceDisk02",,%ExeBaseDir%\ppc\arm

            [SourceDisksNames.MIPS]
            2=, "SourceDisk03",,%ExeBaseDir%\ppc\mips

            [SourceDisksNames.SH3]
            2=, "SourceDisk04",,%ExeBaseDir%\ppc\sh3

            [SourceDisksFiles] <-說明源文件分別放在什么目錄下,必須有該段
            "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)行文件拷貝的說明段,參看下面的說明
            CEShortcuts = Links <-指定需要生成的快捷方式定義. 除了這連個(gè)安裝操作外,開發(fā)人員還可以指定注冊表修改(AddReg), 自定的安裝/卸載時(shí)的可執(zhí)行代碼(CESetupDLL), 注冊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用來表示源文件文件名;copy flags表示拷貝文件時(shí)的方式,該值是一些標(biāo)志位的組合,可用的標(biāo)志如下:

            標(biāo)志 含義
            0x00000001 警告用戶如果在拷貝該文件時(shí)發(fā)生錯(cuò)誤, 而用戶采用跳過操作的話
            0x00000002 不允許用戶在拷貝該文件時(shí)發(fā)生錯(cuò)誤才取跳過操作
            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è)對該文件的鏈接,主要是用于共享dll文件

            "demo.exe",,,0x40000003

            [Files.Windows] <-同上,用戶定義文件拷貝操作
            "demo.dll",,,0x80000013

            [DestinationDirs] <-定義設(shè)備上的目標(biāo)文件目錄
            Files.InstallDir = 0,%InstallDir% <- 格式為<section name> = 0,<dest directory>, 其中section name 對應(yīng)[DefaultInstall] CopyFiles中的值。dest directory則是目標(biāo)設(shè)備上的目的目錄。例如Files.InstallDir里列出的文件將會拷貝到目標(biāo)設(shè)備的%InstallDir%目錄下。
            Files.Windows = 0, %CE2%
            Links = 0, %CE11%

            [Links] <- 該段對應(yīng)[DefaultInstall]中CEShortcuts的定義,用來說明需要創(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è)目錄下。

              以上是針對PPC的inf文件寫法。由于PPC支持多種的CPU所以比較復(fù)雜一些,而Smartphone目前實(shí)際上目前只支持一種CPU類型,所以我們可以對inf文件進(jìn)行簡化。其中文件的第1和第4部分的內(nèi)容還是和PPC一樣。而第2和第3部分則可以簡化成:

            [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文件來生成.cab文件。該命令的語法如下:

            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ò)誤信息都會用消息框來顯示。該參數(shù)主要用于自動化構(gòu)建
            cpu_type – 指定需要生成的CPU類型,需要與inf文件中定義的CEDevice段的后綴一致。可以同時(shí)指定多個(gè)CPU類型

              假設(shè)我們前面例子中的inf文件名為demo.inf文件。則對應(yīng)的執(zhí)行命令為:

            cabwiz demo.inf /err buildppc.err /cpu ARM MIPS SH3

              這樣就會生成 demo.arm.cab, demo.mips.cab, demo.sh3.cab 三個(gè)文件,分別對應(yīng)3種不同的CPU(平臺)的安裝文件。

            制作自動安裝執(zhí)行文件

              生成了cab文件并不意味著大功告成。雖然用戶可以手工將cab文件拷貝到設(shè)備上安裝,但這樣需要用戶自己懂得區(qū)分CPU類型等許多的專業(yè)知識。所以我們通常都會進(jìn)一步生成一個(gè)可執(zhí)行的自動化安裝包,達(dá)到傻瓜化安裝的目的。如果你的安裝過程比較簡單的話,可以使用Spb Software House(http://www.spbsoftwarehouse.com)公司提供的免費(fèi)軟件ezsetup進(jìn)行可執(zhí)行安裝文件的制作。該軟件生的安裝程序功能比較簡單:顯示產(chǎn)品信息和軟件授權(quán)協(xié)議,然后安裝cab文件。雖然功能比較少,但大部分的PPC/Smartphone軟件的安裝過程也只需要這幾個(gè)功能就足夠了。

              首先我們需要制作一個(gè)demo.ini文件。該文件的格式很簡單,PPC和Smartphone對應(yīng)的格式都一樣。例子如下:

            [CEAppManager]
            Version = 1.0 <- 這個(gè)是CeAppMgr程序的版本號,不是要安裝的軟件的版本號,不必修改
            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)行自動化構(gòu)建。命令的使用方法如下:

            ezsetup <-l language> <-i inifilename> <-r readme.txt>
            <-e eula.txt> <-o outputexe>

            -l language 是指定安裝過程中使用的語言,暫時(shí)不支持中文,所以我們選English
            -i inifilename ini文件的全路徑
            -r readme.txt readme文件的全路徑,用于在安裝過程中顯示給用戶
            -e eula.txt最終用戶授權(quán)協(xié)議文件的全路徑,用于安裝過程中授權(quán)協(xié)議界面的顯示
            -o outputexe 生成的exe文件的名稱

              我們可以用下面的命令來生成可執(zhí)行安裝文件:

            ezsetup -l english -i demo.ini -r Readme.txt -e License.txt -o demo_setup.exe

            自動化構(gòu)建

              前面分別介紹了如何在命令行編譯鏈接目標(biāo)程序,制作cab文件,以及生成自動化安裝程序。這些步驟都是可以通過命令行方式執(zhí)行的,所以我們可以把這些命令在批處理腳本中串接起來制作自動化構(gòu)建腳本。這樣我們就可以“一鍵”完成從代碼編譯到生成最終可執(zhí)行安裝包的全過程。

            posted on 2009-04-23 18:40 Sandy 閱讀(288) 評論(0)  編輯 收藏 引用 所屬分類: Window Mobile
            久久天天躁狠狠躁夜夜av浪潮 | 99热成人精品免费久久| 亚洲欧洲精品成人久久奇米网| 国产精品久久99| 久久精品国产只有精品2020| 久久精品国产亚洲av麻豆色欲| 色偷偷偷久久伊人大杳蕉| 成人午夜精品无码区久久 | 无码8090精品久久一区| 亚洲AV伊人久久青青草原| 国内精品久久久久久久影视麻豆| 国产午夜久久影院| 久久免费美女视频| 精品无码久久久久久久久久| 麻豆久久| 少妇精品久久久一区二区三区| 久久久久免费看成人影片| 精品久久久噜噜噜久久久 | 欧美一区二区三区久久综| 久久香蕉超碰97国产精品 | 手机看片久久高清国产日韩| 女人高潮久久久叫人喷水| 亚洲国产精品无码成人片久久| 麻豆一区二区99久久久久| 国产一级持黄大片99久久| 久久伊人中文无码| 免费精品国产日韩热久久| 久久人人爽人人爽人人AV| 91精品国产91久久| 国产aⅴ激情无码久久| 久久久久综合网久久| 伊人伊成久久人综合网777| 久久国产色AV免费观看| 精品国产91久久久久久久a| 久久无码中文字幕东京热| 久久久久一区二区三区| 狠狠色丁香婷婷久久综合五月| 亚洲精品高清国产一久久| 一本色综合网久久| 精品欧美一区二区三区久久久| 无遮挡粉嫩小泬久久久久久久|