版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
InstallShiled12顯示軟 協(xié) 判斷是否安裝了本軟件所需要的先決軟件JKD1.6.0_04,如無,則啟動外部安裝程序進(jìn)行 用戶的輸入信息、所選安裝路徑、所選安裝組件將顯示在安裝界面上(Installshield雖 筆者所用的環(huán)境為Installshield12Edition,WindowsXPwithSP2,Installshield2008EditionInstallshield2008下面我們一步一步來建立一個基本的工程,并且使用來完善和豐富所需功能 打開Installshield程序程序因為兼具BasicProject基本類型和InstallscriptProject 半 我比較喜歡用。像我這樣需求的,既要用到Wizard的便利,又想寫一 定義操作的,就比較適合用這種類型啦。 選擇類型為WindowsInstaller|InstallScriptMSIProjcet,輸入工程名,指定工程所在的文件夾 點擊引導(dǎo)條上的Application公司名,公司名將會出現(xiàn)在Setup.exe 界面會切換到ProjectAssistant,我們先從這里開始把工程的基本組件和基本文件建立 在Proje sistant界面的底部,會有一個引導(dǎo)動作條,在建立該工程的基本結(jié)構(gòu)和文件 報一個String_ID1點擊引導(dǎo)條上的Installation點擊引導(dǎo)條上的Installation設(shè)置為一個Feature,用戶可 將選項DoyouwanttocustomizeyourInstallation選擇為Yes點擊選中根節(jié)點InstallationArchitecture,點擊New創(chuàng)建新的Feature,可以為每個Feature指定還可以在Feature下創(chuàng)建子Feature,比如如果文檔Feature安裝部分或者全部文檔了。這里我們沒有用到子Feature,用途和普通Feature一樣。這里,建立好所有這里,建立好所有Feature切換到InstallationDesigner找到InstallationDesigner頁面上左邊導(dǎo)航樹Organization|FeaturessFeature有Name和DisplayName兩種名稱,我們剛才改的不過是DisplayName,為了便于查看和使用,我們在這里把Name也改一下注意Name繼續(xù)切換回Project點擊引導(dǎo)條上的Application在這里對安裝路徑進(jìn)行微調(diào),并且為每個Feature,這里我不想使用ProgramFiles|CompanyName|ProductName這個路徑 ProgramFiles|ProductName,我直接點擊選中MyProductName[INSTALLDIR]拖動到ProgramFileFolder下還可以直接將MyProductName改成自己想要的文件夾名字,接下來,為每個Feature打開這個下拉列表,所有的Feature都在這里,按順序來給每一個Feature建立文件夾,并且,選擇第一個Feature,即Server,點擊MyProductName[INSTALLDIR]節(jié)點 在菜單上選擇NewFolder來創(chuàng)建一個文件夾。,創(chuàng)建一個Server再在Server文件夾下創(chuàng)建一個icon文件夾,存放該組件所用的圖標(biāo)然后為該Feature添加安裝時該Feature這里我們建立的icon文件夾是用來存放這個feature在后面要建立快捷方式時使用的圖標(biāo)的。為這個icon文件夾添加相應(yīng)的圖標(biāo)文件,并且記住圖標(biāo)文件的來源文件夾,后面設(shè)置快捷方式點擊選中要添加文件的文件夾,然后點擊右下角的AddFiles接下來我們?yōu)镕eature添加文件夾,如果這個文件夾中的全部文件都為這個Feature所需。添點擊選中要添加文件夾的文件夾,然后點擊右下角的AddFolders ludesubfolders選項。如法制為每個Feature這個Feature,除了文件所用的圖標(biāo)外,什么都不要添加,后面 點擊引導(dǎo)條上的Application點擊New選擇一個要建立快捷方式的Feature如果要建立快捷方式的程序為非.exe形式,請把FilesOf選擇選為AllFiles(*.*)我們的程序安裝目標(biāo)路徑設(shè)置在ProgramFiles下,因此雙擊[ProgramFilesFolder]我們這里要為client.bat建立一個快捷方式,因為這個是啟動用的批處理文 Createshortcutin CreateshortcutonDesktopUsealternateshortcutIconAssociateafileextensionwiththeshortcut’starget鉤選第三項,并且點擊Browse請回想剛才在為Feature添加文件的時候,每個feature都添加了對應(yīng)的icon。這里,請把瀏覽的文件夾設(shè)定為剛才添加icons所用的文件夾,通俗的說,就是你剛才從哪兒添加一個圖標(biāo)進(jìn)feature的,現(xiàn)在還是從哪兒添加的這個圖標(biāo)。進(jìn)來,打包進(jìn)安裝文件才可以。這一點上不能不提一下visualstudio,這個工具做安裝程序雖如法制為每個Feature指定快捷方式, 我們再切換去InstallationDesigner,找到SystemConfiguration|Shortcuts看到快捷方式在開始菜單中是以公司名|軟件名|快捷方式 (不要告訴我你不會改,直接拖動Test文件夾往Program 序”)下一塞即可,然后刪除掉多余的CompanyName文件夾。(可能剛才在ProjectAssistant界面有人已經(jīng)注意到了左邊欄上MoreOptions下Createanuninstallationshortcut這個 似乎只有在安裝某個feature的時候這個卸載快捷方式才會出現(xiàn)(當(dāng)然,就是那個default 的feature形式?jīng)Q定了每個文件或者快捷方式都必須明確地歸屬到某個feature下),因此,當(dāng)你的客戶只選擇了其他feature安裝時,這個卸載方式不會出現(xiàn),而他必如果你寫使得安裝時會拷貝一些外部文件進(jìn)來,那么這些文件在這種卸載方式下是刪除不掉的。(如果你確實想保存這些文件,你可以在里設(shè)置它們屬性為permanent,這個屬 點擊引導(dǎo)條上的Application 點擊引導(dǎo)條上的Installation這個問題當(dāng)時折騰了我一個星期(當(dāng)然那時候才接觸Installshield,還一竅不通),最后問了切換去InstallationDesigner,找到InstallationInformation|GeneralInformation,看到StringTables下面是什么?對,所有你選的語言都列出來了,選中你要的語言,右鍵,選擇MakeDefault,OKProjectAssistant去把所有不要的語言統(tǒng)統(tǒng)去掉鉤選即看到此處,已經(jīng)變成了English為默認(rèn)語言了點擊引導(dǎo)條上的BuildInstallation第二部分:編 協(xié)判斷是否安裝了本軟件所需要的先決軟件JKD1.6.0_04,如無,則啟動外部安裝程序進(jìn)行 在安裝結(jié)束時,顯示readme.txt編程這部分都將在InstallerDesignerInstallshield大小寫敏感,因此請嚴(yán)格按照示例上所寫的大小寫規(guī)則來書寫。例:字符串STRING和string都支持,但是String不支持1.顯示軟協(xié)1.添 在左邊導(dǎo)航樹上找到BehaviorandLogic|SupportFiles/Billboards在SupportFilesLanguageIndependent和所有你所選擇的語言類型。LanguageIndependent意為,如果你在這里分支下做了設(shè)置,那么無論選擇用何種語言安點擊LanguageIndependent,這 在右邊的Files欄 ,在彈出菜單上選擇InsertFiles選項 到Files欄中協(xié)議允許兩種文本格式:txt和rtftxt然后切換到BehaviorandLogic|InstallScript中間的導(dǎo)航欄Files下有一個默認(rèn)的Rul文件Setup.Rul,我們這個工程的全部installscript代碼都將寫在這個默認(rèn)文件里點擊選中Setup.Rul節(jié)點,右邊會顯示該文件的可編程面框中選擇BeforeMoveData選項,然后在第二個下拉框中選擇OnBegin選項(不要因為默在functionOnBegin()的函數(shù)體里面寫代碼來顯示剛才添加的 容,直接把下面的代碼拷貝到OnBegin()函數(shù)的begin和end;之間就可以了DisableSdLicense2("License","","",SUPPORTDIR^"2.txt",Disable SdLicense2("License","","",SUPPORTDIR^"2.txt", SdLicense2(szTitle,szOpt1,szOpt2,szLicenseFile,bLicenseAccepted zOpt1和szOpt2就是這兩個選項,如果填寫空字符串,則會顯示為默認(rèn)值"Iacceptthetermsofthelicenseagreement"和"IdonotacceptthetermsofthelicenseagreszieseFle可協(xié)議文本放在uotflentlhild即SUOTIR2tx參數(shù)四:bLicenseAccepted,布爾型變量,TRUE狀態(tài),則在協(xié)議界面上默認(rèn)選中的是那個“同意”的選項;不過好像一般更常見的是默認(rèn)選中為“不同意”FA這是協(xié)議的界面。當(dāng)用戶選擇了Iacceptthetermsofthelicenseagreement這個選項后,Next按鍵可用,安裝程序可以繼續(xù)。(請忽略這里顯示的協(xié)議內(nèi)容…網(wǎng)上有很多軟件協(xié)議的范本供...), ,顯示協(xié)議的函數(shù)一共有三個SdLicense,SdLicenseRtf和SdLicense2,參數(shù)略有不同,顯示的界面符合大多數(shù)目前流行的安裝界面的。2.判斷是否安裝了本軟件所需要的先決軟件或運行環(huán)1代碼還是在OnBegin()函數(shù)體內(nèi)實現(xiàn),直接把下面的代碼拷貝到OnBegin()函數(shù)的和end;if(RegDBKeyExist("SOFTWARE\\JavaSoft\\JavaDevelopmentKit\\1.6.0_04")0)LaunchAppAndWait(SRCDISK^"jdk\\jdk-6u4-windows-i586-p.exe","",LAAW_OP 表鍵值根節(jié)點為HKEY_LOCAL_MACHINE打 電腦”下的根節(jié)點有HKEY_CLASSES_ROOT,_USER,HKEY_LOCAL_MACHINE等。我們這次要尋找的JDK軟件的 表鍵值在HKEY_LOCAL_MACHINE下,因此要把根鍵設(shè)置為HKEY_LOCAL_MACHINE。 表,開始-〉運行-〉輸入命令RegDBKeyExist("SOFTWARE\\JavaSoft\\JavaDevelopmentKit\\1.6.0_04")<判斷是否存在鍵值SOFTWARE\\JavaSoft\\JavaDevelopmentKit\\1.6.0_04,這個是JDK1.6.0_04安裝時向 RegDBKeyExistszSubKey);10LaunchAppAndWait(SRCDISK^"jdk\\jdk-6u4-windows-i586-p.exe","",LAAW_OP當(dāng)上面判斷了沒有安裝JDK1.6.0_04jdk文件夾下的jdk-6u4-windows-i586-p.exe安裝程序來安裝。這個函數(shù)在help里是這樣敘述的LaunchAppAndWait(szProgram,szCmdLine,nOptions參數(shù)一:szProgram,即要啟動的程序。這里我們寫入的參數(shù)是SRCDISK^"jdk\\jdk-6u4-,\jdk-6u4-windows-i586-p.exe"源盤下jdk文件夾下的jdk-6u4-windows-i586-p.exe安默安裝,鼠標(biāo)外形改變等等。參閱Installshield自帶的Help。這里我們用LAAW_OPTION_WAIT,即當(dāng)JDK安裝結(jié)束后(無論是正常安裝了,還是用戶點擊取消了安裝),安裝 這里在函數(shù)體里面,沒有對找不到JDK安裝程序,以及安裝出錯等情況做判斷。如果用戶有需if(RegDBKeyExist("SOFTWARE\\JavaSoft\\JavaDevelopmentKit\\1.6.0_04")0)if(LaunchAppAndWait(SRCDISK^"jdk\\jdk-6u4-windows-i586-p.exe","",LAAW_MessageBox("Youhaven'tinstalledJDK1.6.0_04yet!",復(fù)上述代碼功能,仍在OnBegin()函數(shù)體內(nèi)執(zhí)行。用戶的輸入信息、所選安裝路徑、所選安裝組件顯示在安裝界面Installshield是自帶這個界面的,在安裝過程中用戶可以看到這個界面,但是這個界面上的信息是空的,這一點讓人很是疑惑,懷疑是Installshield的bug。因此我們不得不手動地實現(xiàn)這這個功能需要在OnFirstUIBefore()函數(shù)體中實現(xiàn),選擇BeforeMoveData|OnFirstUIBefore選項dXXXX都對應(yīng)著一個界面,例如 e就是對應(yīng)著最初開始的歡迎界面。如果開發(fā)對這些很熟悉,可以在這里對每一個界面編程設(shè)置。找到Dlg_SdStartCopy這個界面選項, 在begin6個feature的名字和兩個NUMBER類型的變量,即藍(lán)色字串。之前在第一6個可用的feature6個feature進(jìn)行一些判斷。在begin字樣后對這6個feature賦值,所賦的值就是我們在第一部分定義的feature(Name,notDisplayName)functionNUMBERnResult,nSetupType,nvSize,STRINGszTitle,szMsg,szQuestion, pany,STRINGLISTlist,BOOLSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGNUMBER//TODO:ifyouwanttoenablebackground,windowtitle,andcaptionbartitl//SetTitle(@PRODUCT_NAME,24,WHITE//SetTitle(@PRODUCT_NAME,0,BACKGROUNDCAPTION//Enable(FULLWINDOWMODE//Enable(BACKGROUND//SetColor(BACKGROUND,RGB(0,128,szFeatureName1szFeatureName2szFeatureName3szFeatureName4szFeatureName5szFeatureName6 在Dlg_SdStartCopy的listStartCopy=ListCreate(STRINGLIST);和ListDestroListAddString(listStartCopy,"UserName:"+ListAddString(listStartCopy,"CompanyName:" ListAddString(listStartCopy,"DestinationLocation:"+switchcaseTYPICAL:ListAddString(listStartCopy,"SetupType:caseCOMPACT:ListAddString(listStartCopy,"SetupType:caseCUSTOM:ListAddString(listStartCopy,"SetupType:ListAddString(listStartCopy,"ListAddString(listStartCopy,"TheSelectedif(FeatureIsItemSelected(MEDIA,szFeatureName1)=1)ListAddString(listStartCopy,"if(FeatureIsItemSelected(MEDIA,szFeatureName2)=1)ListAddString(listStartCopy,"if(FeatureIsItemSelected(MEDIA,szFeatureName3)=1)ListAddString(listStartCopy,"if(FeatureIsItemSelected(MEDIA,szFeatureName4)=1)ListAddString(listStartCopy,"if(FeatureIsItemSelected(MEDIA,szFeatureName5)=1)ListAddString(listStartCopy,"if(FeatureIsItemSelected(MEDIA,szFeatureName6)=1)ListAddString(listStartCopy,"把要顯示的信息添加到list里去,這個list的內(nèi)容稍后會添加到界面上進(jìn)行顯示Help里對這個函數(shù)是這樣描述的:ListAddStringlistID,szStringnPlacementFlag參數(shù)一:listID,需要用戶事先創(chuàng)建一個list,這里我們看到listStartCopy=ListCreate(STRINGLIST);這句話,即創(chuàng)建了一個叫l(wèi)istStartCopy的list參數(shù)二:szString,要添加的字符 switchcaseTYPICAL:ListAddString(listStartCopy,"SetupType:caseCOMPACT:ListAddString(listStartCopy,"SetupType:caseCUSTOM:ListAddString(listStartCopy,"SetupType:和CUSTOM。if(FeatureIsItemSelected(MEDIA,szFeatureName1)=1)ListAddString(listStartCopy,"這里的FeatureIsItemSelected(MEDIA,szFeatureName1)=1feature。Help里對這個函數(shù)是這樣描述的:FeatureIsItemSelected(szFeatureSource,szFeature);help自帶的例子里寫的MEDIA,就是如果用戶選擇了這個feature1list里添加一個關(guān)于該feature的相關(guān)信息即找到UserInterface|在中間的導(dǎo)航樹上找到SdStartCopy這里我們使用的是英文界面,因此點擊選中English選選中這個界面上的將會顯示用戶信息的框,把右邊的Visible選項設(shè)置為False即Dlg_SdStartCopy界面里,用戶還可以設(shè)置左上角顯示的標(biāo)題和消息,szTitle";szMsg="";這兩行代碼如果賦值為空,則顯示如圖所示的默認(rèn)信息,用戶可以賦值成自己.,這個用途常見于配置文件和文件的應(yīng)用,同一程序給不同的用戶,只需要不同的配置和文件。如果將配置和文件每次都打包在安裝程序里,那么變更一個用戶就需要重新打包一次,這是一個浪費時間和精力的行為。如果將和配置文件(當(dāng)然內(nèi)容是加密過的)放在,另外,本程序的好幾個feature用到了相同的庫,如果直接在feature下加庫文件也可以,但是每一個feature都加一次這個庫文件夾,整個安裝程序就會變得很龐大,因此比較理想的情況是選到了這個feature的時候從外部拷貝這些庫文件。這里我們先不包括文檔這個feature的說明,文檔feature這個功能需要在OnFirstUIAfter()AfterMoveData|OnFirstUIAfter選項,即在選擇了移動哪些數(shù)據(jù)后這個操作生效。之前我們已經(jīng)接觸過了如何判斷是否選擇了某個Feature,這里也需要判斷是否選擇了某個Feature,并且根據(jù)這個Feature來拷貝對應(yīng)的外部文件function//featureSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGNUMBERSTRINGszTitle,szMsg1,szMsg2,szOption1,NUMBERbOpt1,//featureszFeatureName1szFeatureName2szFeatureName3szFeatureName4szFeatureName5szSrcFile1=szSrcFile2=szTarFolder1=szTarFolder2=對每一個feature在OnFirstUIAfter()的begin和end之間添加如下代碼//copythelibtothetarget,copythenecessaryfiletotheif(FeatureIsItemSelected(MEDIA,szFeatureName1)=1)CopyFile(SRCDISK^szSrcFile1,CopyFile(SRCDISK^"Test\\configure\\background.gif",TARGETDIR^"Server\\CopyFile(SRCDISK^"Test\\configure\\configure.dat",TARGETDIR^"Server\\configure.dat");if(FeatureIsItemSelected(MEDIA,szFeatureName2)=1)CopyFile(SRCDISK^szSrcFile1,CopyFile(SRCDISK^"Test\\configure\\configure.dat",TARGETDIR^"Client\\configure.dat");CopyFile(SRCDISK^"Test\\configure\\license.dat",TARGETDIR^"Client\\license.if(FeatureIsItemSelected(MEDIA,szFeatureName3)=1)CopyFile(SRCDISK^szSrcFile1,CopyFile(SRCDISK^"Test\\configure\\configure",TARGETDIR^"WatchPortion\\CopyFile(SRCDISK^"Test\\configure\\license.dat",TARGETDIR^"Watchif(FeatureIsItemSelected(MEDIA,szFeatureName4)=1)CopyFile(SRCDISK^szSrcFile1,if(FeatureIsItemSelected(MEDIA,szFeatureName5)=1)CopyFile(SRCDISK^szSrcFile1,if(FeatureIsItemSelected(MEDIA,szFeatureName1)=1)CopyFile(SRCDISK^szSrcFile1,CopyFile(SRCDISK^"Test\\configure\\background.gif",TARGETDIR^"Server\\CopyFile(SRCDISK^"Test\\configure\\configure.dat",TARGETDIR^"Server\\configure.dat");FeatureIsItemSelected(MEDIA,szFeatureName1)這個函數(shù)用于判斷用戶是否選擇了某feature。Help里對這個函數(shù)是這樣描述的:FeatureIsItemSelectedszFeatureSource,szFeature);help自帶的例子里寫的MEDIA,就是1,則說明用戶選擇了這個CopyFile(SRCDISK^szSrcFile1,拷貝文件的函數(shù)。Help里是這樣描述的:CopyFile(szSrcFile,szTargetFile);這個功能仍然在AfterMoveData|OnFirstUIAfter()function//featureSTRINGszSrcFile3;//STRINGszTarFolder3;//;//STRINGszDocFile,szDocFileName;//szDocFile,查找函數(shù)返回的查詢得到文件名;szNUMBERnResult;////featureszFeatureName6 szSrcFile3=szTarFolder3=szTarFolder4=TARGETDIR^"Docs";//仍然在begin和end之間的函數(shù)體內(nèi)把下面的代碼拷貝進(jìn)去即if(FeatureIsItemSelected(MEDIA,szFeatureName6)=1)then//如果選擇了此featuif(CopyFile(SRCDISK^szSrcFile3,szTarFolder3)=0)then//那么把要拷貝的文件拷貝nResult=FindAllFiles(TARGETDIR^"Docs","*.pdf",szDocFile,RESET);//對拷貝while(nResult=LongPathToQuote(szDocFile,TRUEParsePath(szDocFileName,szDocFile,FILENAME_ONLY);//對查找到的文件獲取文件AddFolderIcon(FOLDER_PROGRAMS^"Test\\Docs",szDocFileName,szDocFile,"",TARGETDIR^"Docs\\icons\\help.ico",0,"",REPLACE);//為該文件創(chuàng)建快捷方式,nResult=FindAllFiles(TARGETDIR^"Docs","*.pdf",szDocFile,CONTINUE);//從if(FeatureIsItemSelected(MEDIA,szFeatureName6)=1)如果用戶選擇了文檔featureif(CopyFile(SRCDISK^szSrcFile3,szTarFolder3)=0)nResult=FindAllFiles(TARGETDIR^"Docs","*.pdf",szDocFile,FindAllFiles(szDir,szFileName,svResult,nOp參數(shù)一:szDir,被查找的文件參數(shù)二:szFileName,需要查找的文件的名字,支持通配符,例如參數(shù)四:nOpCONTINUE,從上一次查找的位置開始查找,這個特性我們呆會兒會用到;RESET,從文件夾的開始位置進(jìn)行查找;CANCEL,釋放被上一次的FindAllFiles查找的函數(shù)。在WindowsNT系統(tǒng)下,需要在安裝過程中使用帶CANCEL的FindAllFiles來釋放之前的查找,確保安裝的正確性(因此我懷疑查找有bug,這個函數(shù)用來彌補這個bug…)LongPathToQuote(szDocFile,TRUEuote函數(shù)加上這個文件名上的括號;否則下面一個函數(shù)無法解析不帶括號的長文件名。LongPathToQuote(svPath,nParameter參數(shù)二:nParameterTRUE,為長文件名加上括號;FALSE,為長文件名脫去ParsePath(szDocFileName,szDocFile,ParsePath(svReturnString,szPath,nOperation);參數(shù)三:nOperation,靜態(tài)變量,指定用何種方式來解析。這里使用FILENAME_ONLY,也AddFolderIcon(FOLDER_PROGRAMS^"Test\\Docs",szDocFileName,szDocFile,"",TARGETDIR^"Docs\\icons\\help.ico",0,"",REPLACE);AddFolderIcon(szProgramFolder,szItemName, mandLine,szWorkingDir,szIconPath,nIcon,szShortCutKey,nFlag);參數(shù)一:szProgramFolder,要創(chuàng)建的快捷方式所在的文件夾。這里FOLDER_PROGRAMS指開始|所有程序,因此我們的快捷方式將會出現(xiàn)在開始|所有程序|Test的Docs下;如 參數(shù)三: mnn,全定路的文名或件夾名可包命令參數(shù)這里入剛才查到的件含路件名擴展讀可能注到這參數(shù)做了些預(yù)理這個處也是騰了次才出來不的操系默認(rèn)路也是是否引號差別這里需要式地定一,以在不操作統(tǒng)上行引起不的結(jié)。參數(shù)四sWrknir,作 Help的解下:設(shè)這個 為的應(yīng)程序件所在的方要置包了應(yīng)程序的 工作 則可傳個空符串這個數(shù)這個參數(shù)一始我未理其含義不過空字串也出錯在來經(jīng)提出要求允用戶自行選是否桌面創(chuàng)建捷方時無中明這參數(shù)的義請者隨尋找個自計算機上任意置的捷方式 擇屬性個szoknir就是性面上的起始位置值為個快方式指的用程所在文夾的路。至在我驗的序里創(chuàng)建開始單的捷方和桌快捷式,個參要的值還略有同的開始單里建可以直傳空符而面快方控字串是會出看屬面板的起位置”參數(shù)六:nIcon。如果不是使用Windows0;Windows圖標(biāo)我沒有研參數(shù)七:szShortCutKey,熱鍵,一般用不到。如果有需要可以設(shè)置為比如"Ctrl+Alt+參數(shù)八:nFlag,靜態(tài)變量,多個用途。這個程序里我們使用了REPLACE,即使用當(dāng)前這個快捷方式的屬性;RUN_IZED,當(dāng)從這個快捷方式登錄程序時,程序界面最大化;R成刻錄大光盤,從VCD盤改成DVD盤。這段代碼在用戶選擇了安裝文檔的條件下,對外部文 的文件創(chuàng)建快捷方式,這個難點在于8個參數(shù)的理解。我在互聯(lián)網(wǎng)上搜索了一陣子,并且啃了一陣子help,但是可能自己外語水平不是很過關(guān),以至于第四個參數(shù)沒有完全理解到整個安裝程序做下來這一段代碼是最難的,F(xiàn)indAllFiles在Help里解釋是當(dāng)碰到第一個符合條件的文件就會停下來,因此如何全部文件,并且獲取文件信息,代碼的撰寫也是費了很大的在安裝結(jié)束時,顯示readme.txt文這是個很有用的設(shè)置但是在InstallScript工程里不是默認(rèn)自帶的因此也需 這段代碼的位置是在AfterMoveData|OnFirstUIAfter()首先,在安裝的時候把readme.txt文件從源盤拷貝到安裝下。把這段代碼拷貝到AfterMoveData|OnFirstUIAfter()的begin和end;之間即可。README.TXT文件放置在源盤的根下,并且在安裝時拷貝到安裝下。創(chuàng)建一個Finish界面,并在界面上設(shè)置詢問是否顯示readme.txt文件的選項之前我們看到當(dāng)我們第一次選取了AfterMoveData|OnFirstUIAfter()選項時,系統(tǒng)會為這個就是結(jié)束界面。Installscript工程默認(rèn)安裝完畢后,界面直接 inish按鈕的界面讓用戶點擊了以后才結(jié)束整個安裝過程。這段代碼就是創(chuàng)建了一個Finish界面了,我們要對這段代碼進(jìn)行改造,使之出現(xiàn) 把上圖中從Disable(STATUSEX);起到SdFinishEx這行的代碼,全部替換成如下代碼bOpt1=bOpt2=szMsg1=szOption1="ShowSdFinishEx(szTitle,szMsg1,szMsg2,szOption1,szOption2,bOpt1,if(bOpt1=TRUE)if(FindFile(TARGETDIR,"README.TXT",szDocFile)=0)LaunchApp(WINDIR^"Notepad.exe",TARGETDIR^"README.TXT" 順序執(zhí)行這個OnFirstUIAfter()的代碼,如果參數(shù)為BACK,則逆序返回參數(shù)所關(guān)聯(lián)的字符串值,這個參數(shù)應(yīng)當(dāng)是一個資源IDSdFinishEx(szTitle,szMsg1,szMsg2,szOption1,szOption2,bOpt1,參數(shù)一:szTitle,即顯示在界面上的左上角的標(biāo)題,如果傳空值,則顯示默參數(shù)四:szOption1,選項名。這個是一個Checkbox,如果設(shè)置為空則不顯示,如果賦值則顯示一個Checkbox并且在這個Checkbox旁邊顯示這個所賦的簡短值。參數(shù)五:szOption2,解釋同上參數(shù)六:第一個選項的狀態(tài),如果設(shè)置為TRUE,則第一個選項Checkbox默認(rèn)為選中狀態(tài),F(xiàn)ALSE則為未選中狀態(tài)。if(bOpt1=TRUE)if(FindFile(TARGETDIR,"README.TXT",szDocFile)=0)為了保險起見,需要進(jìn)一步判斷一下這個readme.txtFindFile(szPath,szFileName,svResult參數(shù)二:szFileName,文件名,包含擴展參數(shù)三:szDocFile,返回的文件LaunchApp(WINDIR^"Notepad.exe",TARGETDIR^"README.TXT"打開readmeHelp里沒有對這個函數(shù)的專門的解釋,但是有個例子,以至于我看了好幾遍才看懂要表達(dá)的意 一下Windows下自帶的程序Notepad.exe,路徑為WINDIR^"Notepad.exe"。如果是一些不是Windows自帶的程序,比如PDF,DOC,還需要從 小結(jié):這個界面我曾經(jīng)試圖寫在OnFirstUIBefore()里的結(jié)尾部分,用Dlg_SdFinish來實現(xiàn), 實我本人是比較討厭結(jié)束的時候有這么一個要看readme的選項的,一般自己裝到這種軟件,都是去掉鉤選框,不看readme的;但是如果直接結(jié)束掉,不出這個結(jié)束界面又覺得提示不足,有時候不能確定安裝程序有沒有結(jié)束,所以私下里還是比較想去掉readme選項,而直接顯示一個只有一個finish按鈕的界面的。在安裝結(jié)束時,允許用戶選擇是否顯示桌面快捷方 checkb這段代碼的位置是在AfterMoveData|OnFirstUIAfter()的函數(shù)里實現(xiàn)的,也就是和“顯示readme文件”的功能放在一起。把從Disable(STATUSEX);起到SdFinishEx這行的代碼,全部替換成如下代碼bOpt1=bOpt2=szMsg1=szOption1="ShowszOption2="CreateShortcutonSdFinishEx(szTitle,szMsg1,szMsg2,szOption1,szOption2,bOpt1,與上面的“顯示readme文件”中的代碼相比,只動了一個地方,即szOption2="CreateShortcutonDesktop?";這個是一個CheckboxCheckbox并且在這個Checkbox旁邊顯示這個所賦的簡短值。if(bOpt2=TRUE)if(FeatureIsItemSelected(MEDIA,szFeatureName1)=1)szDocFile=LongPathToQuote(szDocFile,TRUEAddFolderIcon(FOLDER_DESKTOP,"Server",szDocFile,TARGETDIR^"Server",TARGETDIR^"Server\\icons\\appClient.ico",0,"",REPLACE);比屬性面板才發(fā)現(xiàn),桌面快捷方式的“起始位置”的值居然是空的,看來Help解釋的“當(dāng)傳空值 讀者可能注意到在AddFolderIcon函數(shù)里的第三個參數(shù)被做了一些預(yù)處理,這個處理也是折騰在安裝結(jié)束后,啟動指定的程這部分很明顯是要在安裝全部結(jié)束后進(jìn)行的,因此放在AfterMoveData|OnEnd把OnEnd()functionSTRINGSTRINGSTRINGif(FeatureIsItemSelected(MEDIA,szFeatureName)=1)if(FindFile(TARGETDIR,"watch.exe",szDocFile)=0)if(LaunchApp(serviceTarget,"")<0)MessageBox("Unabletolaunch"+serviceTarget+".",if(FeatureIsItemSelected(MEDIA,szFeatureName)=1)當(dāng)用戶選擇了這個featureif(FindFile(TARGETDIR,"watch.exe",szDocFile)=0) e。當(dāng)該文件存在時,返回值為0if(LaunchApp(serviceTarget,"")<0)這里L(fēng)aunchApp6段的用法略有不同。這個函數(shù)的本意是啟動第一個參數(shù)指MessageBox("Unabletolaunch"+serviceTarget+".", 不友好;現(xiàn)在在安裝完畢后做到了靜默啟動,用戶無需做任何事情。而且這個服務(wù)需要JDK的支持,配合上述第2段中判斷是否安裝了JDK這個應(yīng)用,就不會出現(xiàn)安裝了此服務(wù)但是無法運安裝結(jié)束后,為JDK設(shè)置一個環(huán)境變之前提到了,要在安裝本系統(tǒng)時判斷是否安裝了JDK,在最初筆者所做的安裝盤中,還要讓用JAVA_HOME在JAVA 這段代碼在BeforeMoveData|OnFirstUIAfter()//writetheenvironmentszKey="SOFTWARE\\JavaSoft\\JavaDevelopmentif(RegDBKeyExist(szKey)=1)then//如果 表值存if(RegDBGetKeyValueEx(szKey,"JavaHome",nvType,svValue,nvSize)=0)then//獲 szKey="SYSTEM\\CurrentControlSet\\Control\\Sessionif(RegDBSetKeyValueEx(szKey,"JAVA_HOME",REGDB_STRING,svValue,-1)<0)MessageBox("Javahomecreatefailed,pleasesetitmanually!",判斷JDK1.6.0_04的 表值是否存在;要判斷JDK1.6.0_04是否被安裝,只有通過 因為設(shè)置JAVA_HOME環(huán)境變量需要JDK的安裝位置,所以要根據(jù) 位置,而幸運的是,該鍵值下的JavaHome鍵名所對應(yīng)的值就是JDK的安裝位置。RegDBGetKeyValueEx(szKey,szName,nvType,svValue,nvSize參數(shù)一:szKey,要查找的 表的鍵,這里我們查找SOFTWARE\\JavaSoft\\JavaDevelopmentKit\\1.6.0_04參數(shù)二:szName,一些表鍵下面會有一些鍵名,如果你去看一下我們查找的鍵,會發(fā)現(xiàn)該鍵下存在多個鍵名,這里我們只要查找JavaHome鍵名對應(yīng)的值,因此,指定szNameJaREGDB_STRING,結(jié)果編譯出錯,參數(shù)四:svValue,返回該鍵名對應(yīng)的參數(shù)五:nvSize,返回該鍵名對應(yīng)的值的字節(jié)szKey="SYSTEM\\CurrentControlSet\\Control\\SessionRegDBSetKeyValueEx(szKey,"JAVA_HOME",REGDB_STRING,svValue,- 表發(fā)現(xiàn)JDK已經(jīng)安裝了,就去讀一下 環(huán)境變量也是利用表鍵值設(shè)置函數(shù)RegDBSetKeyValueEx來實現(xiàn)的,這個鍵是一個特殊"SYSTEM\\CurrentControlSet\\Control\\SessionManager\\EnvironmeRegDBSetKeyValueEx(szKey,szName,nType,szValue,nSize TEM\\CurrentControlSet\\Control\\SessionManager\\Environment"參數(shù)四:szValue,就是鍵值了,這里我們已經(jīng)從上面得到了JDK的安裝路徑,就把安裝路徑參數(shù)五:nSize,help里說明如果鍵類型為REGDB_STRINGREGDB_STRING_EXPAND,REGDB_NUMBER時,都可以設(shè)置該值為-1,installshield會自動為我們計算正確的長度,而當(dāng)鍵類型為REGDB_BINARY和REGDB_STRING_MULTI時,就必須傳該鍵值的實小結(jié):Installshield默認(rèn)鍵值位置是在HKEY_CLASSES_ROOT下的,因此在這里,我們需要在進(jìn)行搜索鍵值和設(shè)置鍵值的操作之前使用RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);這句話來設(shè)置一下默認(rèn)的根鍵值為HKEY_LOCAL_MACHINE;另,在網(wǎng)上看了一個帖 者說當(dāng)時為了解決這個問題,是在代碼頭加上DISABLE(LOGGING);代碼尾加上ENABLE(LOGGING)來實現(xiàn)的,雖然我沒有碰到這個問題,但是還是很感謝這位作者,因為當(dāng)時他也說了,根本找不到資料,自己啃了天書般的HELP來解決, 完美卸9點我們提到過InstallScript工程里自帶的Uninstall快捷方式的缺陷,這里這段代碼在BeforeMoveData|OnFirstUIAfter()里,和其他創(chuàng)建快捷方式的代碼放一functionSTRINGszfilename,szFolderNUMBERszfilename=UNINSTALL_STRING+"nresult=ifnresult>=0StrSub(szmsg1,szfilename,0,nresult+StrSub(szmsg2,szfilename,nresult+LongPathToQuote(szmsg1,FALSELongPathToQuote(szmsg2,FALSEszfilename="\""+szmsg1+"\""szfilename=UNINSTALL_STRING+"不過指向的位置不是我們的源盤里的setup.exeC:\ProgramFiles\InstallShieldInstallationInformation\{0D9DF66A-44E5-4754-A522-2AD6C9D5CDBE}\setup.exe;Installshield創(chuàng)建的安裝文件在安裝時總會在這個文件夾里創(chuàng)建對應(yīng)信息,一長串?dāng)?shù)字型序列碼就是安裝程序的ProductID。利用這個setup.exe就可以進(jìn)行反安裝參數(shù)二:/UNINSTALL,告訴程序啟動這個setup.exe時為非安裝狀態(tài),即修復(fù)、重新安裝和"C:\ProgramFiles\InstallShieldInstallationInformation\{0D9DF66A-44E5-4754-A522-2AD6C9D5CDBE}\setup.exe"-runfromtemp-l0x0409/UNINSTALLnresult=尋找到“.exe”這個字符串在szfilename這個字符串中的位置StrFind(szString,參數(shù)一:szString,被查找的源字符StrSub(szmsg1,szfilename,0,nresult+StrSub(szmsg2,szfilename,nresult+szmsg1C:\ProgramFiles\InstallShieldInstallation而szmsg2-runfromtemp-l0x0409/HelplStrSub(svSubStr,szString,nStart,nLength參數(shù)二:szfilenameLongPathToQuote(szmsg1,FALSELongPathToQuote(szmsg2,FALSEWindows下的長文件名就有這個缺szfilename="\""+szmsg1+"\""||Testifendif;代碼看上去簡直就是多此一舉。在Installshield7之前,一直是這樣寫的:szfilename=UNINSTALL_STRING+"從Installshield8開始,長文件名一直有引號封閉不正確的問題,因此ifendif;代碼完全是為 emove即可進(jìn)行卸載。中所有從安裝程序中安裝的文件都卸載掉,包括安裝時從外部拷貝的文件。利用Proje stant創(chuàng)建的卸載快捷方式則無法卸載掉安裝時從外部拷貝的文件。完美卸載之卸載時觸發(fā)命令(卸載Windows服務(wù)里(參閱第二部分的第8小節(jié)),在安裝完畢后,啟動了一個指定程序,這個指定程序干的事情就是向Windows寫了一個服務(wù)進(jìn)去(有 的同學(xué)可以去看看JavaService相關(guān)資料,是一個把Java程序 為Windows服務(wù)的一個工具或者說是組件更合適些);所以,這里希望首先我們介紹一下兩條WindowscmdSCstop這條命令用于停止某個名叫XXX的正在運行的Windows服SCdelete這條命令用于刪除某個名叫XXX的Windows服一開始思路是這樣的,獲取安裝程序的卸載狀態(tài),然后調(diào)用這兩條命令來刪除服務(wù);沒想到szfilename=UNINSTALL_STRING+"/UNINSTALL";這句話改成szfilename=UNINSTALL_STRING+"后來想在Onbegin里添加一個 ategoryid=7ategoryid=7,這里面其實是談反安裝時候不執(zhí)行OnMaintUIBefore函數(shù)的問題, 于是打開BeforeMoveData|這里就運用了一個函數(shù)LaunchAppAndWait來達(dá)到目的。其實一開始我還在想是不是要寫批LaunchAppAndWait(szProgram,szCmdLine,nOptions參數(shù)一:szProgram,要運行的程序。在Help里有這樣一句解釋:想在命令行里指定要運行參數(shù)三:靜態(tài)變量,操作類型,這里L(fēng)AAW_OPTION_HIDDEN可以使批處理窗口隱藏掉,如 Installshield原始安裝界面我始終覺得很丑,幸好Installscript InstallationDesigner的左邊導(dǎo)航樹上找到UserInterface|Dialogs|Skins選項下面顯示了不同的界面風(fēng)格,默認(rèn)是None,選擇一個喜好的風(fēng)格即可,筆者一般使用Blue或BlueTC,適用于一般商業(yè)軟件的穩(wěn)2.。1第一步,指定一個打包的配置版本,如果使用同一個安裝程序源來打包成不同的配置,就可 過濾設(shè)置,筆者從來沒用過。貌似是對feature的一些設(shè)置參數(shù),大概是針對某些版本,如果某些feature不需要的話,就直接過濾掉軟件比如Oracle4安裝程序的語言和被安裝的應(yīng)用程序的語言沒有必然聯(lián)系,因此這里還需要設(shè)置一下安裝時決于在做安裝程序時選擇的語言,剛才我們只選擇了English,因此這里只顯示English了。 Automatic會自動為你檢測所需光盤的規(guī)格數(shù)量,以及制作出光盤77.這個選項指定了打包時的形態(tài)Compressallfiles:所有的文件都壓縮打包(這里不包括 的文件,只包括在Proje sistant里指定到各個feature下的文件Leavefiles pressedandseparatefromtheinstallationpackage:所有的文 是否要包括.NETFramework,Installshield\MyProjectName\ProductConfigurationX\ReleaseX\DiskImages\DISK1下品的印象打折扣的。可以使用Flash或者其 之前在第二部分的第九小節(jié)里提到了安裝完畢后,為JDK設(shè)置一個環(huán)境變量,事實上這個文檔但是,很快發(fā)現(xiàn)了新問題,在表里添加環(huán)境變量和在桌面上“電腦”里直接添加環(huán)境變量是不一樣的;表里的操作,都需要通過重啟動計算機來使之生效,所以出現(xiàn)了:當(dāng)這個setsetif(LaunchApp(serviceTarget,"")<0)if(LaunchApp(serviceTarget,javahome)<0)這里javahome就是第九小節(jié)里if(RegDBSetKeyValueEx(szKey,"JAVA_HOME",REGDB_STRING,svValue,-1)<0)then這句話里的svValue,即JDK的安裝路徑。LaunchApp(serviceTarget,不能不佩服IS函數(shù)設(shè)計者,在這篇文檔里,三個地方用到了LaunchApp這個函數(shù),而且每個處理文件,批處理接收到JDK路徑后,便可以正確啟動了。這個問題其實和JavaSerive以及操作系統(tǒng)相關(guān);因為在筆者的計算機上一直沒有發(fā)現(xiàn)這個問Path的問題,只要在Path里添加上JRE的Bin文件路徑,這個服務(wù)就可以正確啟動了。因為沒有深入了解JavaSerive的運行機制和Windows服務(wù)的運行機制,也沒有深究為什么了,猜內(nèi)容中添加JRE路徑,并且要考慮內(nèi)容之間的分號問題l要考慮到卸載狀態(tài)時,不能把Path卸載。說到這個問題,要提一下前面的第九小節(jié),發(fā)現(xiàn)引 表鍵值的理解還是不正確的,Help里關(guān)于RegDBSetKeyValueEx有這樣一句話However,thenewlycreatedkeyisnotloggedforuninstallationunlessitisasubkeyofakeyalreadyloggedforuninstallation.也就程序內(nèi)容仍然添加在OnEnd()szKey="SOFTWARE\\JavaSoft\\JavaRuntimeEnvironment\\1.6.0_04";//jre的RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);//設(shè)置一下根if(RegDBKeyExist(szKey)=1)then//if(RegDBGetKeyValueEx(szKey,"JavaHome",nvType,svValue,nvSize)=0)then//查javaPath=//wirtetheenvironmentvariableszKey="SYSTEM\\CurrentControlSet\\Control\\Session javaPath=javaPath+"\\bin";//jre\bin的路if(RegDBGetKeyValueEx(szKey,"Path",nvType,svValue,nvSize)=0)then//如果if(svValue!="")if(StrFind(svValue,javaPath)<0)then//如果path還沒有jre\bin;//svValue=javaPath;//如果沒有這個鍵值,把值也直接添加進(jìn)去,事實上這個情況也不會出現(xiàn),因為path在操作系統(tǒng)安裝完畢后就存在了,//除非你手動刪除了,但是那樣操作系統(tǒng)也會if(RegDBSetKeyValueEx(szKey,"Path",REGDB_STRING_EXPAND,svValue,-0)then//MessageBox("Pathcreatefailed,pleasesetitmanually!",szKey="SYSTEM\\CurrentControlSet\\Control\\Session 需要尋找的是JRE下的bin文如果Pathif(StrFind(svValue,javaPath)<0)判斷返回的鍵值里是否包含jre的bin文件夾的路StrFind(szString,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個人房產(chǎn)買賣合同協(xié)議書3篇
- 2025年度個人貨車租賃與物流配送綜合服務(wù)合同3篇
- 2025版商業(yè)建筑門窗安裝與安全性能檢測合同3篇
- 2025-2030全球異溴丙烷行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國2,3,4-三氯硝基苯行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025版?zhèn)€人房屋裝修安全責(zé)任與施工監(jiān)理協(xié)議
- 商鋪租賃合同轉(zhuǎn)讓協(xié)議范文
- 現(xiàn)代醫(yī)療體系中的病患支持服務(wù)模式
- 跨領(lǐng)域合作項目的挑戰(zhàn)與應(yīng)對策略
- 二零二五年度離婚財產(chǎn)分割與子女生活技能培訓(xùn)合同2篇
- 沉積相及微相劃分教學(xué)課件
- 鉗工考試題及參考答案
- 移動商務(wù)內(nèi)容運營(吳洪貴)任務(wù)五 引發(fā)用戶共鳴外部條件的把控
- 工程造價專業(yè)職業(yè)能力分析
- 醫(yī)藥高等數(shù)學(xué)知到章節(jié)答案智慧樹2023年浙江中醫(yī)藥大學(xué)
- 沖渣池施工方案
- 人教版初中英語八年級下冊 單詞默寫表 漢譯英
- 學(xué)校網(wǎng)絡(luò)信息安全管理辦法
- 中國古代文學(xué)史 馬工程課件(下)21第九編晚清文學(xué) 緒論
- 2023年鐵嶺衛(wèi)生職業(yè)學(xué)院高職單招(語文)試題庫含答案解析
- 2205雙相不銹鋼的焊接工藝
評論
0/150
提交評論