版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、前言Installshield可以說是最好的做安裝程序的商業(yè)軟件之一,不過因為功能的太過于強大,以至于上手和精通都不是容易的事情,之前都是用Installshield的Project Assistant對付過去的,這次做這個安裝程序,為了實現(xiàn)一些功能,必須寫代碼,國內(nèi)外現(xiàn)成的資料很少,而且很多都語焉不詳,自己反復啃了多次,對比Installshiel自帶的help,才明白資料所表達的意思。這個安裝程序雖然比較簡陋,在行家眼里可能是小菜一碟,但是也花了筆者一個星期的時間,閱讀了很多資料,啃了好幾天英文help,集成了很多先驅(qū)者的經(jīng)驗,也費了自己不少心血做成的,對每一段代碼的用處、每一個用到的函數(shù)
2、都進行了詳細的說明,因此轉(zhuǎn)載時請務(wù)必保留轉(zhuǎn)載出處和由艾澤拉斯之海洋女神出品的字樣;如需刊登,請與作者聯(lián)系。在此要感謝吞硬幣的小豬,天下曉明,余滿青,海洋C+樂園(此海洋不是彼海洋)等大蝦在互聯(lián)網(wǎng)上的無私奉獻,他們的貼子和博客給了我很大啟示。因為本人是做java出身的,因此對這種類C+語言還是第一次接觸,有理解不當之處,請朋友們指正。歡迎Email至正文需求:公司做了一個軟件產(chǎn)品,1.該軟件運行需要JDK環(huán)境(不是JRE,因為該軟件要向windows注冊一個服務(wù),用到了JavaService,JDK才支持這個功能;不過這里側(cè)重于判斷是否安裝了某軟件是否安裝,而不是糾纏于該裝JDK還是該裝JRE)
3、;2.由于是Server-Client形式的,需要允許用戶選擇安裝組件,比如A機只裝Server端,B機只裝Client端;3.文檔不打包在安裝程序里,直接存放在光盤文件夾下方便用戶查看,同時允許用戶指定是否安裝文檔到計算機上(為什么這樣做,后面說明詳細原因);4.該軟件會以授權(quán)形式發(fā)放給用戶,不同的用戶,軟件本身可能相同,而不同的只是授權(quán)文件和一些配置,因此希望授權(quán)文件和配置文件不打包在安裝程序里,而直接存放在光盤里,以減少可能的重復打包安裝程序的勞動;5.在安裝完畢后,希望能自啟動程序(因為該軟件需要在安裝完畢后啟動一個程序,該程序?qū)崿F(xiàn)向Windows注冊服務(wù)的功能,該程序最好由安裝程序啟
4、動,而不是由客戶手動啟動)。6.希望有反安裝程序本文提到的“外部”指不打包在安裝程序里的,與安裝程序一起存放在光盤里的一些文件夾,這些文件夾包含了安裝中所需要的文件,同時也可能有其他用途,因此不適合直接壓縮打包在安裝程序里。該實例實現(xiàn)了如下功能:1.顯示軟件許可協(xié)議2.判斷是否安裝了本軟件所需要的先決軟件JKD1.6.0_04,如無,則啟動外部安裝程序進行安裝(同樣原理可以用來判斷是否安裝了其他軟件,只要該軟件在注冊表中有鍵值)3.安裝允許用戶選擇需要安裝的組件4.用戶的輸入信息、所選安裝路徑、所選安裝組件將顯示在安裝界面上(Installshield雖然自帶了此界面,但是默認是顯示為空的,需
5、要寫腳本來顯示信息)5.根據(jù)用戶選擇的組件,在開始菜單顯示程序的快捷方式(同樣適用于桌面快捷方式,后面做詳細說明)6.根據(jù)用戶選擇的組件,從外部文件夾拷貝相應(yīng)的文件到安裝目標路徑的文件夾中7.根據(jù)從外部拷貝進來的文件,創(chuàng)建快捷方式(這里主要是拷貝文檔,并在開始菜單中創(chuàng)建快捷方式)8.在安裝結(jié)束時,顯示readme.txt文件9.在安裝結(jié)束后,啟動指定的程序10.完美卸載筆者所用的環(huán)境為Installshield 12 Premier Edition,Windows XP with SP2, 該環(huán)境下建立的工程可以直接使用在Installshield 2008 Premier Edition下,
6、Installshield 2008在打開Installshield 12所建的工程時會提示你是否需要進行Upgrade,確認即可,軟件會自動為你進行升級,很方便。下面我們一步一步來建立一個基本的工程,并且使用腳本來完善和豐富所需功能第一部分:基本設(shè)置1.打開Installshield 12 Premier Edition,新建一個Installscript MSI Project,這種被稱之為半腳本程序,因為兼具Basic Project基本類型和Installscript Project全腳本類型兩者的優(yōu)點,我比較喜歡用。像我這樣需求的,既要用到Wizard的便利,又想寫一點腳本來實現(xiàn)一點
7、自定義操作的,就比較適合用這種類型啦。選擇類型為Windows Installer | InstallScript MSI Projcet,輸入工程名,指定工程所在的文件夾。2.界面會切換到Project Assistant,我們先從這里開始把工程的基本組件和基本文件建立好。3.在Project Assistant界面的底部,會有一個引導動作條,在建立該工程的基本結(jié)構(gòu)和文件時,我們都將在此界面進行操作,下文都將以“引導條”來指代這個引導動作條。4.點擊引導條上的Application Information這里輸入:公司名,公司名將會出現(xiàn)在Setup.exe的注解中軟件名,將會出現(xiàn)在安裝過程的
8、左上角標題欄上版本號,沒看到在哪,不過自己比較方便地知道自己在編譯哪個版本的軟件公司網(wǎng)址,沒看到在哪,而且如果該公司沒有網(wǎng)址呢?而且這里有點bug,好像默認的值總是會報一個String_ID1為空的錯誤,自己輸入一個網(wǎng)址就不會報錯。是否在你創(chuàng)建了更新時自動通知最終用戶,沒用過,我都選了No。選擇一個圖標,這個圖標會出現(xiàn)在“添加或刪除程序”里,我一般用默認的,當然你可以替換成自己想要的圖標。5.點擊引導條上的Installation Requirement這里選擇對操作系統(tǒng)和一些軟件的需求。根據(jù)自己需要來選擇是否要求操作系統(tǒng)的版本,已經(jīng)是否要求安裝了某些軟件。6.點擊引導條上的Installat
9、ion Architecture這是個十分有用的設(shè)置,對于本文所用的分布式軟件來說非常合適,分布式軟件的每個組件可以設(shè)置為一個Feature,用戶可以自由選擇安裝某些功能。將選項Do you want to customize your Installation選擇為Yes。點擊選中根節(jié)點Installation Architecture,點擊New創(chuàng)建新的Feature,可以為每個Feature指定新名稱。還可以在Feature下創(chuàng)建子Feature,比如如果文檔Feature下包括軟件本身文檔,和軟件所需的運行環(huán)境的文檔,那么可以創(chuàng)建兩個子Feature,分別包含兩種文檔,用戶在安裝時就可
10、以選擇安裝部分或者全部文檔了。這里我們沒有用到子Feature,用途和普通Feature一樣。不出現(xiàn)選擇安裝的組件出現(xiàn)選擇安裝組件這里,建立好所有Feature后,我們將切換到Installation Designer做一個設(shè)置找到Installation Designer頁面上左邊導航樹Organization | Features分支,你會看到這里Features都顯示為原始的名稱,而非我們改過的名字,因為Feature有Name和Display Name兩種名稱,我們剛才改的不過是Display Name,為了便于查看和使用,我們在這里把Name也改一下注意Name不可以有空格,可以使用
11、下劃線繼續(xù)切換回Project Assistant7. 點擊引導條上的Application Files 我們將在這里對安裝路徑進行微調(diào),并且為每個Feature指定需要安裝的文件這里我不想使用Program Files | Company Name | Product Name這個路徑,我想使用Program Files | Product Name,我直接點擊選中My Product NameINSTALLDIR拖動到ProgramFileFolder下,還可以直接將My Product Name 改成自己想要的文件夾名字接下來,為每個Feature指定要安裝的文件。打開這個下拉列表,所有
12、的Feature都在這里,按順序來給每一個Feature建立文件夾,并且導入所需的文件。選擇第一個Feature,即Server,點擊My Product NameINSTALLDIR節(jié)點,右鍵點擊,在菜單上選擇New Folder來創(chuàng)建一個文件夾。創(chuàng)建一個Server文件夾,這個文件夾將用來存放該組件需要的一些文件。再在Server文件夾下創(chuàng)建一個icon文件夾,存放該組件所用的圖標。然后為該Feature添加安裝時該Feature要安裝的文件。這里我們建立的icon文件夾是用來存放這個feature在后面要建立快捷方式時使用的圖標的。為這個icon文件夾添加相應(yīng)的圖標文件,并且記住圖標文件
13、的來源文件夾,后面設(shè)置快捷方式的時候要用。點擊選中要添加文件的文件夾,然后點擊右下角的Add Files,然后添加文件接下來我們?yōu)镕eature添加文件夾,如果這個文件夾中的全部文件都為這個Feature所需。添加文件夾的好處在于只要文件夾位置和名稱不變,那么文件夾里面的文件都是動態(tài)加載的,有多少加載多少,不用考慮文件名的改動帶來的影響。點擊選中要添加文件夾的文件夾,然后點擊右下角的Add Folders,然后添加文件夾。選中文件夾,點擊確定。會詢問你是否要使用動態(tài)文件鏈接,我都選擇確定,好處就在于我剛才上面所述。顯示了源文件夾,如果這個文件夾下有子文件夾,并且也需要一并添加進來的話,務(wù)必鉤選
14、Include subfolders選項。這里還允許做一些簡單設(shè)置來包含或者排除一些特定文件,支持通配符。點擊OK確定加入文件夾。如法炮制為每個Feature建立文件夾,并且添加文件,最后效果如圖所示Document這個Feature,除了文件所用的圖標外,什么都不要添加,后面我們將用安裝時實時拷貝的方式來拷貝文檔進來。8. 接下來我們?yōu)榭蓤?zhí)行文件創(chuàng)建快捷方式。點擊引導條上的Application Shortcuts 點擊New新建一個快捷方式選擇一個要建立快捷方式的Feature。如果要建立快捷方式的程序為非.exe形式,請把Files Of選擇選為All Files(*.*)格式。我們的程
15、序安裝目標路徑設(shè)置在Program Files下,因此雙擊ProgramFilesFolder打開,層層點擊進入。我們這里要為client.bat建立一個快捷方式,因為這個是啟動用的批處理文件。Installshield可以自動監(jiān)測到.exe文件的存在,自動生成快捷方式,用戶只需要做一些適當修改即可。新建的快捷方式將出現(xiàn)在這里,名字不好聽,樣子也不好看,我們將為它改一個名字,并且換一個圖標。選中快捷方式,點擊Rename,并且為這個快捷方式改一個適當?shù)拿帧W⒁庥疫叺膸讉€選項。Create shortcut in Start Menu,將在開始菜單里創(chuàng)建一個快捷方式。Create shortc
16、ut on Desktop,將在桌面上創(chuàng)建一個快捷方式。Use alternate shortcut Icon,替換快捷方式的圖標Associate a file extension with the shortcuts target,沒用過,不知道什么意思。我們在這里將只創(chuàng)建開始菜單的快捷方式,因此鉤選第一項。鉤選第三項,并且點擊Browse來瀏覽圖標。請回想剛才在為Feature添加文件的時候,每個feature都添加了對應(yīng)的icon。這里,請把瀏覽的文件夾設(shè)定為剛才添加icons所用的文件夾,通俗的說,就是你剛才從哪兒添加一個圖標進feature的,現(xiàn)在還是從哪兒添加的這個圖標。其實這一
17、點我是一直很費解的,當初不知道要這么選擇圖標,隨便從外面一個任意文件夾里添加了一個圖標,以至于打包后死活找不到圖標,后來經(jīng)過試驗才知道這個被選中的圖標文件要拷貝進來,打包進安裝文件才可以。這一點上不能不提一下visual studio,這個工具做安裝程序雖然功能一般,但是思想還是不錯的,當它的組件指定拷貝了圖標文件后,在建立快捷方式時,快捷方式使用的圖標是指向虛擬的安裝目標路徑下的圖標文件的,而不是指定到這個實實在在的源文件夾。這一點差別就體現(xiàn)出了思想上的差異。如法炮制為每個Feature指定快捷方式,Document除外,因為我們在這個feature里除了圖標文件外什么都沒有添加。至此我們?yōu)?/p>
18、每個可執(zhí)行程序添加了開始菜單下的快捷方式。我們再切換去Installation Designer,找到System Configuration | Shortcuts??吹娇旖莘绞皆陂_始菜單中是以公司名軟件名快捷方式這種形式存在的。事實上我是不喜歡這種形式了,想想點開一層還有一層,不如直接了當來得干脆,因此做一些修改。這里我改成了如下設(shè)置不要告訴我你不會改,直接拖動Test文件夾往Program Menu(即開始菜單下的那個“所有程序”)下一塞即可,然后刪除掉多余的Company Name文件夾。9. 可能剛才在Project Assistant界面有人已經(jīng)注意到了左邊欄上More Optio
19、ns下Create an uninstallation shortcut這個誘人的字樣了??墒俏乙嬖V你,如果你選擇了這種方式建立卸載快捷方式的話,你會很沮喪地發(fā)現(xiàn):a) 似乎只有在安裝某個feature的時候這個卸載快捷方式才會出現(xiàn)(當然,就是那個default feature,這種要命的feature形式?jīng)Q定了每個文件或者快捷方式都必須明確地歸屬到某個feature下),因此,當你的客戶只選擇了其他feature安裝時,這個卸載方式不會出現(xiàn),而他必須去“添加或卸載程序”里面去卸載b) 如果你寫腳本使得安裝時會拷貝一些外部文件進來,那么這些文件在這種卸載方式下是刪除不掉的。(如果你確實想保存
20、這些文件,你可以在腳本里設(shè)置它們屬性為permanent,這個屬性可以保證什么卸載方式都不能刪除你的這些文件)。所以這里我們忽視這個卸載快捷方式的存在,而將在后面采用腳本形式實現(xiàn)完美卸載。10. 點擊引導條上的Application Registry 向注冊表寫鍵和鍵值,由于本工程不需要,忽略之。有需要的朋友可以查閱相關(guān)資料,不難。11. 點擊引導條上的Installation Location 這個是用來設(shè)置安裝包的語言的,選擇了多個語言后,用戶可以在安裝界面開始的時候選擇安裝時所用的語言;不過作為一個公司產(chǎn)品來說,這么偷懶,客戶的印象是要打折扣的,所以還是選個單語言吧,該什么語言的安裝包就
21、什么語言的安裝包,各歸各。不過你又會沮喪地發(fā)現(xiàn),如果要選擇一種其他語言作為Default Language,好像又報錯了。這個問題當時折騰了我一個星期(當然那時候才接觸Installshield,還一竅不通),最后問了技術(shù)支持才得以解決。切換去Installation Designer,找到Installation Information | General Information,看到String Tables下面是什么?對,所有你選的語言都列出來了,選中你要的語言,右鍵,選擇Make Default,OK,再切換回Project Assistant去把所有不要的語言統(tǒng)統(tǒng)去掉鉤選即可??吹酱?/p>
22、處,已經(jīng)變成了English為默認語言了。12. 點擊引導條上的Build Installation。打包安裝盤的設(shè)置,本人從來不用這個選項,都用工具條上的Release Wizard。至此,第一部分基本完成。如果是一些沒有特別要求的安裝包,這部分講解的內(nèi)容足夠可以做一個基本的安裝包了在開始進行編程前,我們先明確一下我們要用編程來彌補前面設(shè)置的哪些功能的不足1. 顯示軟件許可協(xié)議2. 判斷是否安裝了本軟件所需要的先決軟件JKD1.6.0_04,如無,則啟動外部安裝程序進行安裝(同樣原理可以用來判斷是否安裝了其他軟件,只要該軟件在注冊表中有鍵值)3. 用戶的輸入信息、所選安裝路徑、所選安裝組件將
23、顯示在安裝界面上(Installshield雖然自帶了此界面,但是默認是顯示為空的,需要寫腳本來顯示信息)4. 根據(jù)用戶選擇的組件,從外部文件夾拷貝相應(yīng)的文件到安裝目標路徑的文件夾中5. 根據(jù)從外部拷貝進來的文件,創(chuàng)建快捷方式(這里主要是拷貝文檔,并在開始菜單中創(chuàng)建快捷方式)6. 在安裝結(jié)束時,顯示readme.txt文件7. 在安裝結(jié)束后,啟動指定的程序8. 完美卸載腳本編程這部分都將在Installer Designer這個界面進行。后面不再贅述。Installshield大小寫敏感,因此請嚴格按照示例上所寫的大小寫規(guī)則來書寫。例:字符串變量STRING和string都支持,但是Strin
24、g不支持。1. 顯示軟件許可協(xié)議1. 添加許可協(xié)議文本在左邊導航樹上找到Behavior and Logic | Support Files/Billboards選項。這個選項允許用戶添加一些在安裝過程中需要用到的文件。中間的導航欄會顯示對應(yīng)的選項在Support Files分支下,會顯示一個Language Independent和所有你所選擇的語言類型。 Language Independent意為,如果你在這里分支下做了設(shè)置,那么無論選擇用何種語言安裝,這個設(shè)置都會生效;而各個語言類型意為,如果你在某語言下做了設(shè)置,那么這個設(shè)置只有在選擇了用這種語言安裝的時候才會生效。點擊Languag
25、e Independent,這次我們將在這個分支下進行試驗。在右邊的Files欄中右鍵點擊,在彈出菜單上選擇Insert Files選項。選擇事先撰寫好的許可協(xié)議的文本文件,插入到Files欄中。許可協(xié)議允許兩種文本格式:txt和rtf格式,此處我們采用 txt格式。2. 然后切換到Behavior and Logic | InstallScript選項,3. 中間的導航欄Files下有一個默認的Rul文件Setup.Rul,我們這個工程的全部installscript代碼都將寫在這個默認文件里4. 點擊選中Setup.Rul節(jié)點,右邊會顯示該文件的可編程面板。5. 許可協(xié)議應(yīng)該在一開始運行安
26、裝程序的時候就顯示,也就是在拷貝數(shù)據(jù)前。請在第一個下拉框中選擇Before Move Data選項,然后在第二個下拉框中選擇OnBegin選項(不要因為默認顯示的是這兩個選項,而不做這個打開下拉列表進行選擇的動作,否則軟件檢測不到你選擇了選項,無法自動添加代碼),則編程界面上會自動添加一些代碼如下圖所示。當然,如果你手動敲代碼上去也是可以的。6. 我們將在function OnBegin()的函數(shù)體里面寫代碼來顯示剛才添加的許可協(xié)議文本的內(nèi)容,直接把下面的代碼拷貝到OnBegin()函數(shù)的begin和end;之間就可以了Disable (BACKBUTTON); if(!MAINTENANCE
27、)then SdLicense2 (License , , , SUPPORTDIR 2.txt, FALSE); endif;. 7. 代碼解釋* Disable (BACKBUTTON); 將“上一步”按鍵設(shè)置為不可用。安裝程序在一開始的時候會有一個默認的開始界面,第二步才顯示許可協(xié)議,一般來說沒必要回退回去看這個什么都沒有的開始界面,因此將回退按鍵設(shè)置為不可用* if(!MAINTENANCE)then endif; 這一個條件用來判斷安裝程序處于何種狀態(tài),安裝、修復、重新安裝或卸載狀態(tài),后三者都屬于MAINTENANCE狀態(tài),因此判斷只有在正常安裝的狀態(tài)才顯示許可協(xié)議* SdLicen
28、se2 (License , , , SUPPORTDIR 2.txt, FALSE); 這個函數(shù)用于在界面上顯示所用的許可協(xié)議。Help里對該函數(shù)的構(gòu)造函數(shù)如下SdLicense2 ( szTitle, szOpt1, szOpt2, szLicenseFile, bLicenseAccepted ); 參數(shù)一:szTitle,顯示在界面左上角的標題,如果填寫空字符串”,則顯示為默認值”License Agreement”。參數(shù)二:szOpt1,我們常見許可協(xié)議界面上會有兩個選項,一個是“同意”,一個是“不同意”,szOpt1和szOpt2就是這兩個選項,如果填寫空字符串,則會顯示為默認值I
29、 accept the terms of the license agreement和I do not accept the terms of the license agreement。參數(shù)三:szOpt2,見參數(shù)二的說明參數(shù)四:szLicenseFile,指定需要顯示的文檔,包含路徑和帶擴展名的文檔名。我們剛才把許可協(xié)議文本放在supportfile選項下了,這個路徑在Installshield里有專門的靜態(tài)變量來指明,即SUPPORTDIR,然后再添加上帶擴展名的文檔名,這里是2.txt。靜態(tài)變量路徑和引號引起來的路徑之間用符號來連接。參數(shù)四:bLicenseAccepted,布爾型變量
30、,TRUE狀態(tài),則在許可協(xié)議界面上默認選中的是那個“同意”的選項;不過好像一般更常見的是默認選中為“不同意”的選項,因此這里可以填入FALSE。這是許可協(xié)議的界面。當用戶選擇了I accept the terms of the license agreement這個選項后,Next按鍵可用,安裝程序可以繼續(xù)。(請忽略這里顯示的許可協(xié)議內(nèi)容網(wǎng)上有很多軟件許可協(xié)議的范本供下載.)小結(jié):至此,許可協(xié)議就添加完畢,在安裝執(zhí)行的時候,用戶就可以看到許可協(xié)議顯示在界面上,并且只有選擇了“同意”選項后,安裝程序才會往下執(zhí)行。顯示許可協(xié)議的函數(shù)一共有三個SdLicense,SdLicenseRtf和SdLic
31、ense2,參數(shù)略有不同,顯示的界面也略有不同,用戶可以根據(jù)喜好來選擇。目前我常用的就是SdLicense2這個函數(shù),顯示的界面符合大多數(shù)目前流行的安裝界面的習慣。2. 判斷是否安裝了本軟件所需要的先決軟件或運行環(huán)境1. 代碼還是在OnBegin()函數(shù)體內(nèi)實現(xiàn),直接把下面的代碼拷貝到OnBegin()函數(shù)的begin和end;之間就可以了RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE); if (RegDBKeyExist (SOFTWAREJavaSoftJava Development Kit1.6.0_04) 0) then LaunchAppAndWai
32、t (SRCDISKjdkjdk-6u4-windows-i586-p.exe, LAAW_OPTION_WAIT); endif; 2. 代碼解釋* RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE); 設(shè)置一下默認的注冊表鍵值根節(jié)點為HKEY_LOCAL_MACHINE。打開注冊表可以看到“我的電腦”下的根節(jié)點有HKEY_CLASSES_ROOT, HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE等。我們這次要尋找的JDK軟件的注冊表鍵值在HKEY_LOCAL_MACHINE下,因此要把根鍵設(shè)置為HKEY_LOCAL_MACHINE。表告
33、訴我你不知道怎么看注冊表,開始-運行-輸入命令regedit * RegDBKeyExist (SOFTWAREJavaSoftJava Development Kit1.6.0_04) 0) 判斷是否存在鍵值SOFTWAREJavaSoftJava Development Kit1.6.0_04,這個是JDK1.6.0_04安裝時向注冊表寫入的值;RegDBKeyExist( szSubKey );如果存在鍵值則返回1,否則返回小于0的隨機數(shù)字。* LaunchAppAndWait (SRCDISKjdkjdk-6u4-windows-i586-p.exe, LAAW_OPTION_WAIT
34、); 當上面判斷了沒有安裝JDK1.6.0_04這個軟件時,則啟動光盤里jdk文件夾下的jdk-6u4-windows-i586-p.exe安裝程序來安裝。這個函數(shù)在help里是這樣敘述的:LaunchAppAndWait ( szProgram, szCmdLine, nOptions ); 參數(shù)一:szProgram,即要啟動的程序。這里我們寫入的參數(shù)是SRCDISKjdkjdk-6u4-windows-i586-p.exe, SRCDISK指源盤,安裝程序所在的盤,光盤和硬盤都可以。jdkjdk-6u4-windows-i586-p.exe源盤下jdk文件夾下的jdk-6u4-windo
35、ws-i586-p.exe安裝程序。參數(shù)二:szCmdLine,如果要啟動的程序需要從命令行讀入?yún)?shù)來啟動,那么在這里寫入對應(yīng)的參數(shù)值;我們這里不需要,因此輸入空字符串”。參數(shù)三:nOptions,靜態(tài)變量,不同的靜態(tài)變量會得到不同的執(zhí)行結(jié)果,比如無等待安裝,靜默安裝,鼠標外形改變等等。詳情請參閱Installshield自帶的Help。這里我們用LAAW_OPTION_WAIT,即當JDK安裝結(jié)束后(無論是正常安裝了,還是用戶點擊取消了安裝),安裝程序才往下繼續(xù)。這里可以看到,當點擊了同意許可協(xié)議的時候,安裝程序會自動檢測是否安裝了JDK,如果沒有安裝,則彈出安裝界面。這里在函數(shù)體里面,沒有
36、對找不到JDK安裝程序,以及安裝出錯等情況做判斷。如果用戶有需要,可以添加一個消息框,提示在找不到安裝程序或者安裝出錯的情況下,用戶可以手動地安裝需要的軟件。代碼可以改寫為RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE); if (RegDBKeyExist (SOFTWAREJavaSoftJava Development Kit1.6.0_04) 0) then if(LaunchAppAndWait (SRCDISKjdkjdk-6u4-windows-i586-p.exe, LAAW_OPTION_WAIT)0)then MessageBox (You h
37、avent installed JDK 1.6.0_04 yet! , INFORMATION); endif; endif; 小結(jié):至此,判斷運行所需軟件的功能結(jié)束,用戶可以自己試驗一下判斷多個軟件。用法就是重復上述代碼功能,仍在OnBegin()函數(shù)體內(nèi)執(zhí)行。3. 用戶的輸入信息、所選安裝路徑、所選安裝組件顯示在安裝界面上Installshield是自帶這個界面的,在安裝過程中用戶可以看到這個界面,但是這個界面上的信息是空的,這一點讓人很是疑惑,懷疑是Installshield的bug。因此我們不得不手動地實現(xiàn)這個功能。1. 這個功能需要在OnFirstUIBefore()函數(shù)體中實現(xiàn),選
38、擇Before Move Data | OnFirstUIBefore選項2. 選擇了這個選項后,軟件會自動在編程界面生成大量代碼,如圖所示,這里的每一個Dlg_SdXXXX都對應(yīng)著一個界面,例如Dlg_SdWelcome就是對應(yīng)著最初開始的歡迎界面。如果開發(fā)人員對這些很熟悉,可以在這里對每一個界面編程設(shè)置。3. 找到Dlg_SdStartCopy這個界面選項,我們將在這里對已有的代碼進行改動,使之顯示用戶輸入的用戶信息、所選安裝路徑和組件等信息4. 首先定義所需變量。在begin前定義6個feature的名字和兩個NUMBER類型的變量,即藍色字串。之前在第一部分我們定義了6個可用的feat
39、ure,這里就要對這6個feature進行一些判斷。在begin字樣后對這6個feature賦值,所賦的值就是我們在第一部分定義的feature的名字(Name, not Display Name)。/- function OnFirstUIBefore() NUMBER nResult, nSetupType, nvSize, nUser; STRING szTitle, szMsg, szQuestion, svName, svCompany, szFile; STRING szLicenseFile; LIST list, listStartCopy; BOOL bCustom; STR
40、ING szFeatureName1; STRING szFeatureName2; STRING szFeatureName3; STRING szFeatureName4; STRING szFeatureName5; STRING szFeatureName6; NUMBER bvOpt1,bvOpt2; begin/ TO DO: if you want to enable background, window title, and caption bar title / SetTitle( PRODUCT_NAME, 24, WHITE ); / SetTitle( PRODUCT_
41、NAME, 0, BACKGROUNDCAPTION ); / Enable( FULLWINDOWMODE ); / Enable( BACKGROUND ); / SetColor(BACKGROUND,RGB (0, 128, 128); szFeatureName1 =Server; szFeatureName2 =Client; szFeatureName3 =Watch_Portion; szFeatureName4 =Log_Portion; szFeatureName5 =Report_Portion; szFeatureName6 =Document; 5. 在Dlg_SdS
42、tartCopy的listStartCopy = ListCreate( STRINGLIST ); 和ListDestroy(listStartCopy);之間的nResult = SdStartCopy( szTitle, szMsg, listStartCopy );之前加入如下代碼。ListAddString(listStartCopy,Customer Information:,AFTER); ListAddString(listStartCopy,User Name: + svName,AFTER); ListAddString(listStartCopy,Company Name
43、: + svCompany,AFTER); ListAddString(listStartCopy,Destination Location: + INSTALLDIR,AFTER); switch (nSetupType) case TYPICAL : ListAddString(listStartCopy,Setup Type: Typical,AFTER); case COMPACT: ListAddString(listStartCopy,Setup Type: Compact,AFTER); case CUSTOM: ListAddString(listStartCopy,Setup
44、 Type: Custom,AFTER); endswitch; ListAddString(listStartCopy, ,AFTER); ListAddString(listStartCopy,The Selected Feature:,AFTER); if (FeatureIsItemSelected(MEDIA, szFeatureName1)=1) then ListAddString(listStartCopy, +szFeatureName1,AFTER); endif; if (FeatureIsItemSelected(MEDIA, szFeatureName2)=1) th
45、en ListAddString(listStartCopy, +szFeatureName2,AFTER); endif; if (FeatureIsItemSelected(MEDIA, szFeatureName3)=1) then ListAddString(listStartCopy, +szFeatureName3,AFTER); endif; if (FeatureIsItemSelected(MEDIA, szFeatureName4)=1) then ListAddString(listStartCopy, +szFeatureName4,AFTER); endif; if
46、(FeatureIsItemSelected(MEDIA, szFeatureName5)=1) then ListAddString(listStartCopy, +szFeatureName5,AFTER); endif; if (FeatureIsItemSelected(MEDIA, szFeatureName6)=1) then ListAddString(listStartCopy, +szFeatureName6,AFTER); endif; 6. 代碼解釋* ListAddString(listStartCopy,XXXXXX,AFTER); 把要顯示的信息添加到list里去,
47、這個list的內(nèi)容稍后會添加到界面上進行顯示。Help里對這個函數(shù)是這樣描述的:ListAddString ( listID, szString, nPlacementFlag ); 參數(shù)一:listID,需要用戶事先創(chuàng)建一個list,這里我們看到listStartCopy = ListCreate( STRINGLIST );這句話,即創(chuàng)建了一個叫l(wèi)istStartCopy的list 參數(shù)二:szString,要添加的字符串參數(shù)三:nPlacementFlag,如果設(shè)置為AFTER,則順序添加;如果為BEFORE,則逆序添加,即新添加的內(nèi)容會放在前面顯示。* switch (nSetupTy
48、pe) case TYPICAL : ListAddString(listStartCopy,Setup Type: Typical,AFTER); case COMPACT: ListAddString(listStartCopy,Setup Type: Compact,AFTER); case CUSTOM: ListAddString(listStartCopy,Setup Type: Custom,AFTER); endswitch; 這是根據(jù)用戶選擇的安裝類型來顯示安裝類型信息。安裝類型分三種:TYPICAL,COMPACT和CUSTOM。* if (FeatureIsItemSel
49、ected(MEDIA, szFeatureName1)=1) then ListAddString(listStartCopy, +szFeatureName1,AFTER); endif; 這里的FeatureIsItemSelected(MEDIA, szFeatureName1)=1是一個很重要的函數(shù),將會在本安裝程序內(nèi)反復出現(xiàn)多次。這個函數(shù)用于判斷用戶是否選擇了某feature。Help里對這個函數(shù)是這樣描述的:FeatureIsItemSelected ( szFeatureSource, szFeature ); 參數(shù)一:szFeatureSource,大意好像是feature的
50、來源,具體不是很明白到底指什么,反正help自帶的例子里寫的MEDIA照抄沒有錯。參數(shù)二:szFeatureName1,就是 feature的名字了如果用戶選擇了這個feature,返回值就為1,往list里添加一個關(guān)于該feature的相關(guān)信息即可。如此反復,判斷所有的feature是否被選擇,如被選擇則添加一個相關(guān)信息即可。這個就是顯示了用戶信息,安裝路徑和安裝組件的信息。如果沒有添加上述代碼,這個界面默認是顯示的,但是信息欄里是空白的。順便說一句,以前在制作這個安裝程序的時候,因為這塊顯示是空白的,那時候?qū)幊桃彩且桓[不通的,情急之下,筆者把這個顯示設(shè)置的框框設(shè)置了不可見。設(shè)置方法如下:
51、找到User Interface | Dialogs 在中間的導航樹上找到SdStartCopy這個選項這里我們使用的是英文界面,因此點擊選中English選項選中這個界面上的將會顯示用戶信息的框,把右邊的Visible選項設(shè)置為False即可小結(jié):在Dlg_SdStartCopy界面里,用戶還可以設(shè)置左上角顯示的標題和消息,szTitle = ; szMsg = ;這兩行代碼如果賦值為空,則顯示如圖所示的默認信息,用戶可以賦值成自己想要顯示的信息。4. 根據(jù)用戶選擇的組件,從外部文件夾拷貝相應(yīng)的文件到安裝目標路徑的文件夾中這個用途常見于配置文件和授權(quán)文件的應(yīng)用,同一程序,授權(quán)給不同的用戶,只
52、需要不同的配置和授權(quán)文件。如果將配置和授權(quán)文件每次都打包在安裝程序里,那么變更一個用戶就需要重新打包一次,這是一個浪費時間和精力的行為。如果將授權(quán)和配置文件(當然內(nèi)容是加密過的)放在外部文件夾中,每次安裝的時候從這個文件夾中讀取拷貝,那么會是一個比較通用型的安裝程序。另外,本程序的好幾個feature用到了相同的庫,如果直接在feature下加庫文件也可以,但是每一個feature都加一次這個庫文件夾,整個安裝程序就會變得很龐大,因此比較理想的情況是選到了這個feature的時候從外部拷貝這些庫文件。這里我們先不包括文檔這個feature的說明,文檔feature另有詳細說明。1. 這個功能需
53、要在OnFirstUIAfter()函數(shù)體中實現(xiàn),選擇After Move Data | OnFirstUIAfter選項,即在選擇了移動哪些數(shù)據(jù)后這個操作生效。2. 之前我們已經(jīng)接觸過了如何判斷是否選擇了某個Feature,這里也需要判斷是否選擇了某個Feature,并且根據(jù)這個Feature來拷貝對應(yīng)的外部文件首先定義一些需要的變量并且進行賦值,藍色字體即為所定義變量和賦值語句function OnFirstUIAfter() /feature name STRING szFeatureName1; STRING szFeatureName2; STRING szFeatureName3;
54、 STRING szFeatureName4; STRING szFeatureName5; STRING szSrcFile1; STRING szSrcFile2; STRING szTarFolder1; STRING szTarFolder2; NUMBER nResult; STRING szTitle, szMsg1, szMsg2, szOption1, szOption2; NUMBER bOpt1, bOpt2; begin/feature 定義szFeatureName1 =Server; szFeatureName2 =Client; szFeatureName3 =Watch_Portion; szFeatureName4 =Log_Portion; szFeatureNa
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年江蘇客運員考試考什么內(nèi)容的題
- 2024年宜賓客車上崗證模擬考試
- 2024年??诳瓦\駕駛員考試虛擬場景考試題
- 2024年長春客運考試口訣是什么
- 2024年杭州客運從業(yè)資格證模擬考試
- 暖通工程施工方案
- 黑龍江省綏化市明水縣第二中學2024-2025學年(五四學制)六年級上學期11月期中道德與法治試題
- 文件檔案儲存管理
- 設(shè)計評審的公正性保障
- 企業(yè)無不良行為承諾書
- 工勤保潔人員院感知識培訓
- 2024年上海奉賢區(qū)高三年級上冊期末高考與等級考一模歷史試卷含答案
- 法律盡職調(diào)查服務(wù)方案
- 電設(shè)施安全隱患大排查大整治專項行動工作總結(jié)
- 高中美術(shù)-建筑藝術(shù)
- 國企職務(wù)犯罪預防
- 整本書閱讀教學策略
- 《大學生與誠信》課件
- 國內(nèi)電控柴油機技術(shù)發(fā)展概況
- 馬克思主義與社會科學方法論(研究生政治課程)復習重點
- 《女性假兩性畸形》課件
評論
0/150
提交評論