installshield打包完整例如_第1頁(yè)
installshield打包完整例如_第2頁(yè)
installshield打包完整例如_第3頁(yè)
installshield打包完整例如_第4頁(yè)
installshield打包完整例如_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

本文格式為Word版,下載可任意編輯——installshield打包完整例如前言

Installshield可以說是最好的做安裝程序的商業(yè)軟件之一,不過由于功能的太過于強(qiáng)大,以至于上手和精通都不是簡(jiǎn)單的事情,之前都是用Installshield的ProjectAssistant對(duì)付過去的,這次做這個(gè)安裝程序,為了實(shí)現(xiàn)一些功能,必需寫代碼,國(guó)內(nèi)外現(xiàn)成的資料很少,而且好多都語(yǔ)焉不詳,自己反復(fù)啃了屢屢,對(duì)比Installshiel自帶的help,才明白資料所表達(dá)的意思。這個(gè)安裝程序雖然比較簡(jiǎn)陋,在行家眼里可能是小菜一碟,但是也花了筆者一個(gè)星期的時(shí)間,閱讀了好多資料,啃了好幾天英文help,集成了好多先驅(qū)者的經(jīng)驗(yàn),也費(fèi)了自己不少心血做成的,對(duì)每一段代碼的用處、每一個(gè)用到的函數(shù)都進(jìn)行了詳細(xì)的說明,因此轉(zhuǎn)載時(shí)請(qǐng)務(wù)必保存轉(zhuǎn)載出處和由艾澤拉斯之海洋女神出品的字樣;如需刊載,請(qǐng)與聯(lián)系。

在此要感謝吞硬幣的小豬,天下曉明,余滿青,海洋C++樂園(此海洋不是彼海洋)等大蝦在互聯(lián)網(wǎng)上的無私奉獻(xiàn),他們的貼子和博客給了我很大啟示。

由于本人是做java出身的,因此對(duì)這種類C++語(yǔ)言還是第一次接觸,有理解不當(dāng)之處,請(qǐng)朋友們指正。歡迎Email至little_fairycat@126.com

正文

需求:公司做了一個(gè)軟件產(chǎn)品,1.該軟件運(yùn)行需要JDK環(huán)境(不是JRE,由于該軟件要向windows注冊(cè)一個(gè)服務(wù),用到了JavaService,

JDK才支持這個(gè)功能;不過這里側(cè)重于判斷是否安裝了某軟件是否安裝,而不是糾纏于該裝JDK還是該裝JRE);

2.由于是Server-Client形式的,需要允許用戶選擇安裝組件,譬如A機(jī)只裝Server端,B機(jī)只裝Client

端;

3.文檔不打包在安裝程序里,直接存放在光盤文件夾下便利用戶查看,同時(shí)允許用戶指定是否安裝文檔

到計(jì)算機(jī)上(為什么這樣做,后面說明詳細(xì)原因);

4.該軟件會(huì)以授權(quán)形式發(fā)放給用戶,不同的用戶,軟件本身可能一致,而不同的只是授權(quán)文件和一些配

置,因此希望授權(quán)文件和配置文件不打包在安裝程序里,而直接存放在光盤里,以減少可能的重復(fù)打包安裝程序的勞動(dòng);

5.在安裝完畢后,希望能自啟動(dòng)程序(由于該軟件需要在安裝完畢后啟動(dòng)一個(gè)程序,該程序?qū)崿F(xiàn)向

Windows注冊(cè)服務(wù)的功能,該程序最好由安裝程序啟動(dòng),而不是由客戶手動(dòng)啟動(dòng))。6.希望有反安裝程序

本文提到的“外部〞指不打包在安裝程序里的,與安裝程序一起存放在光盤里的一些文件夾,這些文件夾包含了安裝中所需要的文件,同時(shí)也可能有其他用途,因此不適合直接壓縮打包在安裝程序里。該實(shí)例實(shí)現(xiàn)了如下功能:1.顯示軟件許可協(xié)議

2.判斷是否安裝了本軟件所需要的先決軟件JKD1.6.0_04,如無,則啟動(dòng)外部安裝程序進(jìn)行安裝(同樣

原理可以用來判斷是否安裝了其他軟件,只要該軟件在注冊(cè)表中有鍵值)3.安裝允許用戶選擇需要安裝的組件

4.用戶的輸入信息、所選安裝路徑、所選安裝組件將顯示在安裝界面上(Installshield雖然自帶了此

界面,但是默認(rèn)是顯示為空的,需要寫腳本來顯示信息)5.根據(jù)用戶選擇的組件,在開始菜單顯示程序的快捷方式(同樣適用于桌面快捷方式,后面做詳細(xì)說明)6.根據(jù)用戶選擇的組件,從外部文件夾拷貝相應(yīng)的文件到安裝目標(biāo)路徑的文件夾中

7.根據(jù)從外部拷貝進(jìn)來的文件,創(chuàng)立快捷方式(這里主要是拷貝文檔,并在開始菜單中創(chuàng)立快捷方式)8.在安裝終止時(shí),顯示readme.txt文件9.在安裝終止后,啟動(dòng)指定的程序10.完美卸載

筆者所用的環(huán)境為Installshield12PremierEdition,WindowsXPwithSP2,該環(huán)境下建立的工程可以直接使用在Installshield2023PremierEdition下,Installshield2023在開啟Installshield12所建的工程時(shí)會(huì)提醒你是否需要進(jìn)行Upgrade,確認(rèn)即可,軟件會(huì)自動(dòng)為你進(jìn)行升級(jí),很便利。下面我們一步一步來建立一個(gè)基本的工程,并且使用腳本來完善和豐富所需功能

第一部分:基本設(shè)置

1.開啟Installshield12PremierEdition,新建一個(gè)InstallscriptMSIProject,這種被稱之為半腳本程序,因

為兼具BasicProject基本類型和InstallscriptProject全腳本類型兩者的優(yōu)點(diǎn),我比較喜歡用。像我這樣需求的,既要用到Wizard的便利,又想寫一點(diǎn)腳本來實(shí)現(xiàn)一點(diǎn)自定義操作的,就比較適合用這種類型啦。

選擇類型為WindowsInstaller|InstallScriptMSIProjcet,輸入工程名,指定工程所在的文件夾。

2.界面會(huì)切換到ProjectAssistant,我們先從這里開始把工程的基本組件和基本文件建立好。

3.在ProjectAssistant界面的底部,會(huì)有一個(gè)引導(dǎo)動(dòng)作條,在建立該工程的基本結(jié)構(gòu)和文件時(shí),我們都

將在此界面進(jìn)行操作,下文都將以“引導(dǎo)條〞來指代這個(gè)引導(dǎo)動(dòng)作條。

4.點(diǎn)擊引導(dǎo)條上的ApplicationInformation這里輸入:

公司名,公司名將會(huì)出現(xiàn)在Setup.exe的注解中軟件名,將會(huì)出現(xiàn)在安裝過程的左上角標(biāo)題欄上

版本號(hào),沒看到在哪,不過自己比較便利地知道自己在編譯哪個(gè)版本的軟件

公司網(wǎng)址,沒看到在哪,而且假使該公司沒有網(wǎng)址呢?而且這里有點(diǎn)bug,好像默認(rèn)的值總是會(huì)報(bào)一個(gè)

String_ID1為空的錯(cuò)誤,自己輸入一個(gè)網(wǎng)址就不會(huì)報(bào)錯(cuò)。

是否在你創(chuàng)立了更新時(shí)自動(dòng)通知最終用戶,沒用過,我都選了No。

選擇一個(gè)圖標(biāo),這個(gè)圖標(biāo)會(huì)出現(xiàn)在“添加或刪除程序〞里,我一般用默認(rèn)的,當(dāng)然你可以替換成自己想

要的圖標(biāo)。

5.點(diǎn)擊引導(dǎo)條上的InstallationRequirement

這里選擇對(duì)操作系統(tǒng)和一些軟件的需求。根據(jù)自己需要來選擇是否要求操作系統(tǒng)的版本,已經(jīng)是否要求

安裝了某些軟件。

6.點(diǎn)擊引導(dǎo)條上的InstallationArchitecture

這是個(gè)十分有用的設(shè)置,對(duì)于本文所用的分布式軟件來說十分適合,分布式軟件的每個(gè)組件可以設(shè)置為

一個(gè)Feature,用戶可以自由選擇安裝某些功能。

將選項(xiàng)DoyouwanttocustomizeyourInstallation選擇為Yes。

點(diǎn)擊選中根節(jié)點(diǎn)InstallationArchitecture,點(diǎn)擊New創(chuàng)立新的Feature,可以為每個(gè)Feature指定新名稱。還可以在Feature下創(chuàng)立子Feature,譬如假使文檔Feature下包括軟件本身文檔,和軟件所需的運(yùn)行環(huán)

境的文檔,那么可以創(chuàng)立兩個(gè)子Feature,分別包含兩種文檔,用戶在安裝時(shí)就可以選擇安裝部分或者全部文檔了。這里我們沒有用到子Feature,用途和普通Feature一樣。

這里,建立好所有Feature后,我們將切換到InstallationDesigner做一個(gè)設(shè)置

找到InstallationDesigner頁(yè)面上左邊導(dǎo)航樹Organization|Features分支,你會(huì)看到這里Features都顯示

為原始的名稱,而非我們改過的名字,由于Feature有Name和DisplayName兩種名稱,我們方才改的不過是DisplayName,為了便于查看和使用,我們?cè)谶@里把Name也改一下

注意Name不可以有空格,可以使用下劃線

繼續(xù)切換回ProjectAssistant

7.點(diǎn)擊引導(dǎo)條上的ApplicationFiles

我們將在這里對(duì)安裝路徑進(jìn)行微調(diào),并且為每個(gè)Feature指定需要安裝的文件

這里我不想使用ProgramFiles|CompanyName|ProductName這個(gè)路徑,我想使用ProgramFiles|Product

Name,我直接點(diǎn)擊選中MyProductName[INSTALLDIR]拖動(dòng)到ProgramFileFolder下,還可以直接將MyProductName改成自己想要的文件夾名字

接下來,為每個(gè)Feature指定要安裝的文件。

開啟這個(gè)下拉列表,所有的Feature都在這里,按順序來給每一個(gè)Feature建立文件夾,并且導(dǎo)入所需的

文件。

選擇第一個(gè)Feature,即Server,點(diǎn)擊MyProductName[INSTALLDIR]節(jié)點(diǎn),右鍵點(diǎn)擊,在菜單上選擇

NewFolder來創(chuàng)立一個(gè)文件夾。

創(chuàng)立一個(gè)Server文件夾,這個(gè)文件夾將用來存放該組件需要的一些文件。再在Server文件夾下創(chuàng)立一個(gè)icon文件夾,存放該組件所用的圖標(biāo)。

然后為該Feature添加安裝時(shí)該Feature要安裝的文件。

這里我們建立的icon文件夾是用來存放這個(gè)feature在后面要建立快捷方式時(shí)使用的圖標(biāo)的。為這個(gè)icon

文件夾添加相應(yīng)的圖標(biāo)文件,并且記住圖標(biāo)文件的來源文件夾,后面設(shè)置快捷方式的時(shí)候要用。

4.首先定義所需變量。

在begin前定義6個(gè)feature的名字和兩個(gè)NUMBER類型的變量,即藍(lán)色字串。之前在第一部分我們定義了6個(gè)可用的feature,這里就要對(duì)這6個(gè)feature進(jìn)行一些判斷。在begin字樣后對(duì)這6個(gè)feature賦值,所賦的值就是我們?cè)诘谝徊糠侄x的feature的名字(Name,notDisplayName)。

//functionOnFirstUIBefore()

NUMBERnResult,nSetupType,nvSize,nUser;

STRINGszTitle,szMsg,szQuestion,svName,svCompany,szFile;STRINGszLicenseFile;

LISTlist,listStartCopy;BOOLbCustom;

STRINGszFeatureName1;STRINGszFeatureName2;STRINGszFeatureName3;STRINGszFeatureName4;STRINGszFeatureName5;STRINGszFeatureName6;NUMBERbvOpt1,bvOpt2;begin

//TODO:ifyouwanttoenablebackground,windowtitle,andcaptionbartitle//SetTitle(@PRODUCT_NAME,24,WHITE);

//SetTitle(@PRODUCT_NAME,0,BACKGROUNDCAPTION);//Enable(FULLWINDOWMODE);//Enable(BACKGROUND);

//SetColor(BACKGROUND,RGB(0,128,128));szFeatureName1=\szFeatureName2=\

szFeatureName3=\szFeatureName4=\szFeatureName5=\szFeatureName6=\

5.在Dlg_SdStartCopy的listStartCopy=ListCreate(STRINGLIST);和

ListDestroy(listStartCopy);之間的nResult=SdStartCopy(szTitle,szMsg,listStartCopy);之前參與如下代碼。

ListAddString(listStartCopy,\ListAddString(listStartCopy,\

ListAddString(listStartCopy,\

ListAddString(listStartCopy,\switch(nSetupType)

caseTYPICAL:ListAddString(listStartCopy,\caseCOMPACT:ListAddString(listStartCopy,\caseCUSTOM:ListAddString(listStartCopy,\

endswitch;

ListAddString(listStartCopy,\

ListAddString(listStartCopy,\if(FeatureIsItemSelected(MEDIA,szFeatureName1)=1)thenListAddString(listStartCopy,\endif;

if(FeatureIsItemSelected(MEDIA,szFeatureName2)=1)thenListAddString(listStartCopy,\endif;

if(FeatureIsItemSelected(MEDIA,szFeatureName3)=1)thenListAddString(listStartCopy,\endif;

if(FeatureIsItemSelected(MEDIA,szFeatureName4)=1)thenListAddString(listStartCopy,\endif;

if(FeatureIsItemSelected(MEDIA,szFeatureName5)=1)thenListAddString(listStartCopy,\endif;

if(FeatureIsItemSelected(MEDIA,szFeatureName6)=1)thenListAddString(listStartCopy,\endif;

6.代碼解釋

*************************************************************ListAddString(listStartCopy,\

把要顯示的信息添加到list里去,這個(gè)list的內(nèi)容稍后會(huì)添加到界面上進(jìn)行顯示。

Help里對(duì)這個(gè)函數(shù)是這樣描述的:ListAddString(listID,szString,nPlacementFlag);參數(shù)一:listID,需要用戶事先創(chuàng)立一個(gè)list,這里我們看到listStartCopy=ListCreate(STRINGLIST);這句話,即創(chuàng)立了一個(gè)叫l(wèi)istStartCopy的list參數(shù)二:szString,要添加的字符串

參數(shù)三:nPlacementFlag,假使設(shè)置為AFTER,則順序添加;假使為BEFORE,則逆序添加,即新添加的內(nèi)容會(huì)放在前面顯示。

*************************************************************switch(nSetupType)

caseTYPICAL:ListAddString(listStartCopy,\caseCOMPACT:ListAddString(listStartCopy,\

caseCUSTOM:ListAddString(listStartCopy,\endswitch;

這是根據(jù)用戶選擇的安裝類型來顯示安裝類型信息。安裝類型分三種:TYPICAL,COMPACT和CUSTOM。

*************************************************************

if(FeatureIsItemSelected(MEDIA,szFeatureName1)=1)thenListAddString(listStartCopy,\endif;

這里的FeatureIsItemSelected(MEDIA,szFeatureName1)=1是一個(gè)很重要的函數(shù),將會(huì)在本安裝程序內(nèi)反復(fù)出現(xiàn)屢屢。這個(gè)函數(shù)用于判斷用戶是否選擇了某feature。Help里對(duì)這個(gè)函數(shù)是這樣描述的:FeatureIsItemSelected(szFeatureSource,szFeature);

參數(shù)一:szFeatureSource,大意好像是feature的來源,具體不是很明白終究指什么,反正help自帶的例子里寫的MEDIA照抄沒有錯(cuò)。

參數(shù)二:szFeatureName1,就是feature的名字了

假使用戶選擇了這個(gè)feature,返回值就為1,往list里添加一個(gè)關(guān)于該feature的相關(guān)信息即可。

如此反復(fù),判斷所有的feature是否被選擇,如被選擇則添加一個(gè)相關(guān)信息即可。

這個(gè)就是顯示了用戶信息,安裝路徑和安裝組件的信息。假使沒有添加上述代碼,這個(gè)界面默認(rèn)是顯示的,但是信息欄里是空白的。

順便說一句,以前在制作這個(gè)安裝程序的時(shí)候,由于這塊顯示是空白的,那時(shí)候?qū)幊桃彩且桓[不通的,情急之下,筆者把這個(gè)顯示設(shè)置的框框設(shè)置了不可見。設(shè)置方法如下:找到UserInterface|Dialogs

在中間的導(dǎo)航樹上找到SdStartCopy這個(gè)選項(xiàng)

這里我們使用的是英文界面,因此點(diǎn)擊選中English選項(xiàng)

選中這個(gè)界面上的將會(huì)顯示用戶信息的框,把右邊的Visible選項(xiàng)設(shè)置為False即可

小結(jié):在Dlg_SdStartCopy界面里,用戶還可以設(shè)置左上角顯示的標(biāo)題和消息,szTitle=\這兩行代碼假使賦值為空,則顯示如下圖的默認(rèn)信息,用戶可以賦值成自己想要顯示的信息。

4.根據(jù)用戶選擇的組件,從外部文件夾拷貝相應(yīng)的文件到安裝目標(biāo)路徑的文件夾中

這個(gè)用途常見于配置文件和授權(quán)文件的應(yīng)用,同一程序,授權(quán)給不同的用戶,只需要不同的配置和授權(quán)文件。假使將配置和授權(quán)文件每次都打包在安裝程序里,那么變更一個(gè)用戶就需要重新打包一次,這是一個(gè)浪費(fèi)時(shí)間和精力的行為。假使將授權(quán)和配置文件(當(dāng)然內(nèi)容是加密過的)放在外部文件夾中,每次安裝的時(shí)候從這個(gè)文件夾中讀取拷貝,那么會(huì)是一個(gè)比較通用型的安裝程序。另外,本程序的好幾個(gè)feature用到了一致的庫(kù),假使直接在feature下加庫(kù)文件也可以,但是每一個(gè)feature都加一次這個(gè)庫(kù)文件夾,整個(gè)安裝程序就會(huì)變得很巨大,因此比較理想的狀況是選到了這個(gè)feature的時(shí)候從外部拷貝這些庫(kù)文件。

這里我們先不包括文檔這個(gè)feature的說明,文檔feature另有詳細(xì)說明。

1.這個(gè)功能需要在OnFirstUIAfter()函數(shù)體中實(shí)現(xiàn),選擇AfterMoveData|OnFirstUIAfter選項(xiàng),即在選擇了移動(dòng)哪些數(shù)據(jù)后這個(gè)操作生效。

2.之前我們已經(jīng)接觸過了如何判斷是否選擇了某個(gè)Feature,這里也需要判斷是否選擇了某個(gè)Feature,并且根據(jù)這個(gè)Feature來拷貝對(duì)應(yīng)的外部文件

首先定義一些需要的變量并且進(jìn)行賦值,藍(lán)色字體即為所定義變量和賦值語(yǔ)句functionOnFirstUIAfter()//featurename

STRINGszFeatureName1;STRINGszFeatureName2;STRINGszFeatureName3;STRINGszFeatureName4;STRINGszFeatureName5;STRINGszSrcFile1;STRINGszSrcFile2;STRINGszTarFolder1;STRINGszTarFolder2;NUMBERnResult;

STRINGszTitle,szMsg1,szMsg2,szOption1,szOption2;NUMBERbOpt1,bOpt2;begin

//feature定義

szFeatureName1=\szFeatureName2=\

szFeatureName3=\szFeatureName4=\szFeatureName5=\//需要拷貝的源文件

szSrcFile1=\

szSrcFile2=\//拷貝的目的地,目標(biāo)文件夾szTarFolder1=\

szTarFolder2=\

3.對(duì)每一個(gè)feature進(jìn)行判斷,進(jìn)行相應(yīng)的文件拷貝

在OnFirstUIAfter()的begin和end之間添加如下代碼:

//copythelibtothetarget,copythenecessaryfiletothetargetif(FeatureIsItemSelected(MEDIA,szFeatureName1)=1)then

CopyFile(SRCDISK^szSrcFile1,TARGETDIR^szTarFolder1);

CopyFile(SRCDISK^\CopyFile(SRCDISK^\background.gif\

CopyFile(SRCDISK^\endif;

if(FeatureIsItemSelected(MEDIA,szFeatureName2)=1)thenCopyFile(SRCDISK^szSrcFile1,TARGETDIR^szTarFolder1);

CopyFile(SRCDISK^\CopyFile(SRCDISK^\endif;

if(FeatureIsItemSelected(MEDIA,szFeatureName3)=1)thenCopyFile(SRCDISK^szSrcFile1,TARGETDIR^szTarFolder1);

CopyFile(SRCDISK^\CopyFile(SRCDISK^\

endif;

if(FeatureIsItemSelected(MEDIA,szFeatureName4)=1)thenCopyFile(SRCDISK^szSrcFile1,TARGETDIR^szTarFolder1);endif;

if(FeatureIsItemSelected(MEDIA,szFeatureName5)=1)thenCopyFile(SRCDISK^szSrcFile1,TARGETDIR^szTarFolder1);endif;

4.代碼解釋

if(FeatureIsItemSelected(MEDIA,szFeatureName1)=1)thenCopyFile(SRCDISK^szSrcFile1,TARGETDIR^szTarFolder1);

CopyFile(SRCDISK^\CopyFile(SRCDISK^\background.gif\

CopyFile(SRCDISK^\endif;

**************************************************************************************

FeatureIsItemSelected(MEDIA,szFeatureName1)這個(gè)函數(shù)用于判斷用戶是否選擇了某feature。Help里對(duì)這個(gè)函數(shù)是這樣描述的:FeatureIsItemSelected(szFeatureSource,szFeature);參數(shù)一:szFeatureSource,大意好像是feature的來源,具體不是很明白終究指什么,反正help自帶的例子里寫的MEDIA照抄沒有錯(cuò)。

參數(shù)二:szFeatureName1,就是feature的名字了假使返回值為1,則說明用戶選擇了這個(gè)feature

**************************************************************************************CopyFile(SRCDISK^szSrcFile1,TARGETDIR^szTarFolder1);

拷貝文件的函數(shù)。Help里是這樣描述的:CopyFile(szSrcFile,szTargetFile);

參數(shù)一:szSrcFile,源文件,可帶路徑,要帶有擴(kuò)展名的文件名。當(dāng)這個(gè)文件帶路徑時(shí),則從這個(gè)指定路徑下拷貝指定的文件;假使是不帶路徑的,則直接從安裝文件所在盤的盤符下尋覓指定的文件來進(jìn)行拷貝。假使要拷貝某個(gè)文件夾下的一系列文件,可以使用通配符。

參數(shù)二:目標(biāo)文件,可帶路徑,要帶有擴(kuò)展名的文件名。當(dāng)這個(gè)文件帶路徑時(shí),則將文件拷貝到這個(gè)指定路徑下;假使是不帶路徑的,則將文件拷貝到安裝路徑下。支持通配符。

小結(jié):上面這段代碼的意思是:假使用戶選擇了某個(gè)feature,則從安裝程序所在的盤下面的一些文件夾下拷貝文件到目標(biāo)路徑下的一些對(duì)應(yīng)文件夾下。這里記住拷貝文件一定要帶上文件的全名,包括擴(kuò)展名。

5.假使用戶選擇了文檔feature,則把文檔文件夾拷貝進(jìn)來,并且對(duì)該文件夾進(jìn)行遍歷,為每一個(gè)文檔創(chuàng)立一個(gè)在開始菜單下的快捷方式

1.這個(gè)功能依舊在AfterMoveData|OnFirstUIAfter()的函數(shù)里實(shí)現(xiàn)先定義一些變量并賦值,藍(lán)色字體functionOnFirstUIAfter()//featurename

STRINGszFeatureName6;//feature名STRINGszSrcFile3;//需要拷貝的源文件

STRINGszTarFolder3;//拷貝的目的地,帶文件名

STRINGszTarFolder4;//拷貝的目標(biāo)文件夾,后面有一個(gè)函數(shù)要用到不帶文件名的目標(biāo)路徑STRINGszDocFile,szDocFileName;//szDocFile,查找函數(shù)返回的查詢得到文件名;szDocFileName,要查找的文件名

NUMBERnResult;//數(shù)字型變量,存放函數(shù)的返回結(jié)果begin

//feature定義

szFeatureName6=\//需要拷貝的源文件

szSrcFile3=\//拷貝的目的地,目標(biāo)文件夾

szTarFolder3=TARGETDIR^\

szTarFolder4=TARGETDIR^\文檔的存放路徑,不帶文件名2.依舊在begin和end之間的函數(shù)體內(nèi)把下面的代碼拷貝進(jìn)去即可

if(FeatureIsItemSelected(MEDIA,szFeatureName6)=1)then//假使選擇了此featureif(CopyFile(SRCDISK^szSrcFile3,szTarFolder3)=0)then//那么把要拷貝的文件拷貝過去

nResult=FindAllFiles(TARGETDIR^\對(duì)拷貝過去的文件進(jìn)行查找,該函數(shù)會(huì)在第一個(gè)符合條件//的文件處中止while(nResult=0)

LongPathToQuote(szDocFile,TRUE);

ParsePath(szDocFileName,szDocFile,FILENAME_ONLY);//對(duì)查找到的文件獲取文件名AddFolderIcon(FOLDER_PROGRAMS^\TARGETDIR^\為該文件創(chuàng)立快捷方式,快捷方式的顯示名就是方才獲取的文件名

nResult=FindAllFiles(TARGETDIR^\從上一個(gè)查找的位置繼續(xù)向下查找,進(jìn)行循環(huán)endwhile;endif;endif;

3.代碼解釋

***************************************************************************************if(FeatureIsItemSelected(MEDIA,szFeatureName6)=1)thenendif;

假使用戶選擇了文檔feature,則進(jìn)行一些相應(yīng)操作

***************************************************************************************if(CopyFile(SRCDISK^szSrcFile3,szTarFolder3)=0)thenendif;

這里執(zhí)行了兩步操作:

第一步,從源盤的Docs文件夾下把所有文件都拷貝安裝路徑的Docs文件夾下,注意在定義變量的時(shí)候使用了通配符

其次步,假使拷貝成功,則返回值為0,那么進(jìn)行下一步相應(yīng)操作

**************************************************************************************nResult=FindAllFiles(TARGETDIR^\

查找目標(biāo)文件夾下所有后綴名為pdf的文件,從文件夾的開始位置進(jìn)行查找,查找成功則返回0。這個(gè)函數(shù)在這里有一個(gè)巧妙的應(yīng)用,由于這個(gè)函數(shù)會(huì)在查找到第一個(gè)符合條件的文件時(shí)就會(huì)中止繼續(xù)向下查找,因此利用靜態(tài)變量的傳值不同,來實(shí)現(xiàn)對(duì)文件夾的全部查找。Help里的解釋如下:

FindAllFiles(szDir,szFileName,svResult,nOp);

參數(shù)一:szDir,被查找的文件夾

參數(shù)二:szFileName,需要查找的文件的名字,支持通配符,例如*.*,*.pdf,*.doc

參數(shù)三:svResult,函數(shù)會(huì)在查找到第一個(gè)符合條件的文件時(shí)中止,返回這個(gè)符合條件的文件的文件名,帶全路徑和含擴(kuò)展名的文件名

參數(shù)四:nOp,靜態(tài)變量。CONTINUE,從上一次查找的位置開始查找,這個(gè)特性我們呆會(huì)兒會(huì)用到;RESET,從文件夾的開始位置進(jìn)行查找;CANCEL,釋放被上一次的FindAllFiles查找的函數(shù)。在WindowsNT系統(tǒng)下,需要在安裝過程中使用帶CANCEL的FindAllFiles來釋放之前的查找,確保安裝的正確性(因此我懷疑查找有bug,這個(gè)函數(shù)用來彌補(bǔ)這個(gè)bug…)。**************************************************************************************LongPathToQuote(szDocFile,TRUE);

szDocFile為上一個(gè)函數(shù)查找到的第一個(gè)符合條件的文件名,帶完整路徑,這個(gè)LongPathToQuote函數(shù)加上這個(gè)文件名上的括號(hào);否則下面一個(gè)函數(shù)無法解析不帶括號(hào)的長(zhǎng)文件名。

Help里的解釋如下:

LongPathToQuote(svPath,nParameter);參數(shù)一:svPath,長(zhǎng)文件名

參數(shù)二:nParameter,靜態(tài)變量。TRUE,為長(zhǎng)文件名加上括號(hào);FALSE,為長(zhǎng)文件名脫去括號(hào)。**************************************************************************************ParsePath(szDocFileName,szDocFile,FILENAME_ONLY);解析帶路徑的長(zhǎng)文件名,返回文件本身的文件名Help里的解釋如下:

ParsePath(svReturnString,szPath,nOperation);。參數(shù)一:svReturnString為返回的解析過的文件名,參數(shù)二:szPath,即被解析的長(zhǎng)文件名

參數(shù)三:nOperation,靜態(tài)變量,指定用何種方式來解析。這里使用FILENAME_ONLY,也就說返回值為不帶路徑、不包含擴(kuò)展名的文件名。這個(gè)文件名被下面一步用作顯示的快捷方式的名稱。**************************************************************************************

AddFolderIcon(FOLDER_PROGRAMS^\TARGETDIR^\創(chuàng)立一個(gè)快捷方式,使用指定的圖標(biāo)。Help里的解釋如下:

AddFolderIcon(szProgramFolder,szItemName,szCommandLine,szWorkingDir,szIconPath,nIcon,szShortCutKey,nFlag);

參數(shù)一:szProgramFolder,要?jiǎng)?chuàng)立的快捷方式所在的文件夾。這里FOLDER_PROGRAMS指開始|所有程序,因此我們的快捷方式將會(huì)出現(xiàn)在開始|所有程序|Test的Docs下;假使要添加到桌面上,可以設(shè)置為FOLDER_DESKTOP;FOLDER_STARTUP指添加為啟動(dòng)項(xiàng);FOLDER_STARTMENU添加到開始菜單下。

參數(shù)二:szItemName,help里解釋很晦澀,解釋為要添加到文件夾下的圖標(biāo)的名稱,即出現(xiàn)的圖標(biāo)旁邊的那個(gè)字符串。其實(shí)就是我們常說的快捷方式的名稱。這里填寫被解析出來的那個(gè)不帶路徑也不帶擴(kuò)展名的文件名。

參數(shù)三:szCommandLine,全限定路徑的文件名或文件夾名,可包含命令行參數(shù)。這里傳入方才查找到的文件名,包含路徑、文件名和擴(kuò)展名。讀者可能注意到這個(gè)參數(shù)被做了一些預(yù)處理,這個(gè)處理也是折騰了幾次才搞出來的,不同的操作系統(tǒng)默認(rèn)路徑也是有是否帶引號(hào)的區(qū)別的,這里需要顯式地指定一下,以免在不同操作系統(tǒng)上運(yùn)行時(shí)引起不同的結(jié)果。

參數(shù)四:szWorkingDir,工作目錄。Help里的解釋如下:設(shè)置這個(gè)目錄為你的應(yīng)用程序文件所在的地方;要設(shè)置包含了應(yīng)用程序的目錄為工作目錄,則可傳一個(gè)空字符串給這個(gè)參數(shù)。這個(gè)參數(shù)一開始我并未理解其含義,不過傳空字符串也沒有出錯(cuò);在后來經(jīng)理提出新要求:允許用戶自行選擇是否在桌面上創(chuàng)立快捷方式時(shí)無意中明白這個(gè)參數(shù)的含義;請(qǐng)讀者隨便尋覓一個(gè)自己計(jì)算機(jī)上的任意位置的快捷方式,右鍵點(diǎn)擊選擇“屬性〞,這個(gè)szWorkingDir就是屬性面板上的“起始位置〞,值為這個(gè)快捷方式所指的應(yīng)用程序所在的文件夾的路徑。至少在我試驗(yàn)的程序里,創(chuàng)立開始菜單的快捷方式和桌面快捷方式,這個(gè)參數(shù)要求的值還是略有不同的,開始菜單里創(chuàng)立,可以直接傳空字符串;而桌面快捷方式,傳控字符串總是會(huì)出錯(cuò),查看屬性面板里的“起始位置〞值為空,因此手動(dòng)地傳了快捷方式所指向的應(yīng)用程序的所在文件夾的路徑,后面在“安裝終止時(shí)允許用戶選擇創(chuàng)立桌面快捷方式〞話題里有詳細(xì)說明。

參數(shù)五:szIconPath,帶全限定名的圖標(biāo)的路徑,即包含路徑、文件名和擴(kuò)展名

參數(shù)六:nIcon。假使不是使用Windows圖標(biāo)的話,統(tǒng)統(tǒng)指定為0;Windows圖標(biāo)我沒有研究過,Help里說可以指定為0,1,2,3…n我猜測(cè)是不是圖標(biāo)文件本身包含了多個(gè)圖標(biāo),而我可以指定使用哪個(gè)圖標(biāo)?參數(shù)七:szShortCutKey,熱鍵,一般用不到。假使有需要可以設(shè)置為譬如\這種形式。參數(shù)八:nFlag,靜態(tài)變量,多個(gè)用途。這個(gè)程序里我們使用了REPLACE,即永遠(yuǎn)使用當(dāng)前這個(gè)快捷方式的屬性;RUN_MAXIMIZED,當(dāng)從這個(gè)快捷方式登錄程序時(shí),程序界面最大化;

RUN_MINIMIZED,當(dāng)從這個(gè)快捷方式登錄程序時(shí),程序界面最小化;NULL,無任何操作(不知道這個(gè)無任何操作適用于何種狀況?)。小結(jié):這段代碼的重點(diǎn)在于

1)實(shí)現(xiàn)對(duì)文件夾下的文件的遍歷。由于之前筆者的文檔都打包在程序里,苦于文檔的名稱和數(shù)量往往變更,每做一次都要花費(fèi)人力物力,而且在光盤里依舊需要單獨(dú)放置一個(gè)文檔文件夾供用戶在沒有安裝程序前的隨時(shí)查看,重復(fù)打包安裝使得安裝內(nèi)容容量巨大,以至于從刻錄小光盤改成刻錄大光盤,從VCD盤改成DVD盤。這段代碼在用戶選擇了安裝文檔的條件下,對(duì)外部文件夾進(jìn)行

了拷貝,并且讀取文件夾下所有的pdf文件(依次類推,只要設(shè)置了正確的過濾條件,可以讀取文件夾下想要的文件)。難點(diǎn)就在于將文件夾下的文件一個(gè)個(gè)讀取出來并且獲取該文件的信息。2)對(duì)讀取的文件創(chuàng)立快捷方式,這個(gè)難點(diǎn)在于8個(gè)參數(shù)的理解。我在互聯(lián)網(wǎng)上探尋了一陣子,并且啃了一陣子help,但是可能自己外語(yǔ)水平不是很過關(guān),以至于第四個(gè)參數(shù)沒有完全理解終究是什么意思,所見的例子也很單調(diào)并且偷懶,能賦〞〞的地方都給賦了〞〞,無語(yǔ)~~~~整個(gè)安裝程序做下來這一段代碼是最難的,F(xiàn)indAllFiles在Help里解釋是當(dāng)碰見第一個(gè)符合條件的文件就會(huì)停下來,因此如何讀取全部文件,并且獲取文件信息,代碼的撰寫也是費(fèi)了很大的功夫,并且參考了別人的程序修改出來的。

6.在安裝終止時(shí),顯示readme.txt文件

這是個(gè)很有用的設(shè)置,但是在InstallScript工程里不是默認(rèn)自帶的,因此也需要腳本編程實(shí)現(xiàn)。這段代碼的位置是在AfterMoveData|OnFirstUIAfter()的函數(shù)里實(shí)現(xiàn)的

1.首先,在安裝的時(shí)候把readme.txt文件從源盤拷貝到安裝目錄下。把這段代碼拷貝到AfterMoveData|OnFirstUIAfter()的begin和end;之間即可。README.TXT文件放置在源盤的根目錄下,并且在安裝時(shí)拷貝到安裝目錄下。

CopyFile(SRCDISK^\這段代碼意味著當(dāng)安裝執(zhí)行的時(shí)候,這個(gè)文件總會(huì)被拷貝過去。

2.創(chuàng)立一個(gè)Finish界面,并在界面上設(shè)置詢問是否顯示readme.txt文件的選項(xiàng)。

之前我們看到當(dāng)我們第一次選取了AfterMoveData|OnFirstUIAfter()選項(xiàng)時(shí),系統(tǒng)會(huì)為我們創(chuàng)立如下代碼(當(dāng)然不創(chuàng)立也不要緊,自己敲就是了)這個(gè)就是終止界面。Installscript工程默認(rèn)安裝完畢后,界面直接消失,而不會(huì)出現(xiàn)一個(gè)帶有Finish按鈕的界面讓用戶點(diǎn)擊了以后才終止整個(gè)安裝過程。

這段代碼就是創(chuàng)立了一個(gè)Finish界面了,我們要對(duì)這段代碼進(jìn)行改造,使之出現(xiàn)一個(gè)是否顯示readme的選項(xiàng)。

把上圖中從Disable(STATUSEX);起到SdFinishEx這行的代碼,全部替換成如下代碼:Disable(STATUSEX);

ShowObjWizardPages(NEXT);bOpt1=TRUE;

bOpt2=TRUE;

szMsg1=SdLoadString(IFX_SDFINISH_MSG1);szTitle=\szMsg1=\szMsg2=\

szOption1=\szOption2=\

SdFinishEx(szTitle,szMsg1,szMsg2,szOption1,szOption2,bOpt1,bOpt2);if(bOpt1=TRUE)then

if(FindFile(TARGETDIR,\

LaunchApp(WINDIR^\endif;endif;

3.代碼解釋

*******************************************************************************************Disable(STATUSEX);

使默認(rèn)的安裝設(shè)置對(duì)話框無效。

*******************************************************************************************ShowObjWizardPages(NEXT);

順序執(zhí)行這個(gè)OnFirstUIAfter()的代碼,假使參數(shù)為BACK,則逆序執(zhí)行

*******************************************************************************************SdLoadString(IFX_SDFINISH_MSG1);

返回參數(shù)所關(guān)聯(lián)的字符串值,這個(gè)參數(shù)應(yīng)當(dāng)是一個(gè)資源ID。

*******************************************************************************************SdFinishEx(szTitle,szMsg1,szMsg2,szOption1,szOption2,bOpt1,bOpt2);參數(shù)一:szTitle,即顯示在界面上的左上角的標(biāo)題,假使傳空值,則顯示默認(rèn)值

參數(shù)二:szMsg1,安裝終止的界面上允許最多有兩個(gè)可選項(xiàng),這個(gè)參數(shù)可以顯示第一個(gè)選項(xiàng)的一些相關(guān)說明,假使賦空則不顯示任何說明

參數(shù)三:szMsg2,解釋同上

參數(shù)四:szOption1,選項(xiàng)名。這個(gè)是一個(gè)Checkbox,假使設(shè)置為空則不顯示,假使賦值則顯示一個(gè)Checkbox并且在這個(gè)Checkbox旁邊顯示這個(gè)所賦的簡(jiǎn)短值。參數(shù)五:szOption2,解釋同上。參數(shù)六:第一個(gè)選項(xiàng)的狀態(tài),假使設(shè)置為TRUE,則第一個(gè)選項(xiàng)Checkbox默認(rèn)為選中狀態(tài),F(xiàn)ALSE則為未選中狀態(tài)。

參數(shù)七:其次個(gè)選項(xiàng)的狀態(tài),解釋同上。

*******************************************************************************************if(bOpt1=TRUE)then

判斷是否選擇了checkbox。假使用戶選擇了這個(gè)選項(xiàng),則進(jìn)行下一步操作*******************************************************************************************if(FindFile(TARGETDIR,\

為了保險(xiǎn)起見,需要進(jìn)一步判斷一下這個(gè)readme.txt是否被拷貝進(jìn)來了Help里解釋如下:

FindFile(szPath,szFileName,svResult);

參數(shù)一:szPath,文件所在的路徑,不包含文件名參數(shù)二:szFileName,文件名,包含擴(kuò)展名參數(shù)三:szDocFile,返回的文件名

假使查找成功,則返回值為1

*******************************************************************************************LaunchApp(WINDIR^\開啟readme文件

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論