installshield制作安裝包本文提到外部指不打包在安裝程序里與一起存放光盤_第1頁
installshield制作安裝包本文提到外部指不打包在安裝程序里與一起存放光盤_第2頁
installshield制作安裝包本文提到外部指不打包在安裝程序里與一起存放光盤_第3頁
installshield制作安裝包本文提到外部指不打包在安裝程序里與一起存放光盤_第4頁
installshield制作安裝包本文提到外部指不打包在安裝程序里與一起存放光盤_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

InstallShiled12顯示軟 協(xié) 判斷是否安裝了本軟件所需要的先決軟件JKD1.6.0_04,如無,則啟動(dòng)外部安裝程序進(jìn)行 用戶的輸入信息、所選安裝路徑、所選安裝組件將顯示在安裝界面上(Installshield雖 筆者所用的環(huán)境為Installshield12Edition,WindowsXPwithSP2,Installshield2008EditionInstallshield2008下面我們一步一步來建立一個(gè)基本的工程,并且使用來完善和豐富所需功能 打開Installshield程序程序因?yàn)榧婢連asicProject基本類型和InstallscriptProject 半 我比較喜歡用。像我這樣需求的,既要用到Wizard的便利,又想寫一 定義操作的,就比較適合用這種類型啦。 選擇類型為WindowsInstaller|InstallScriptMSIProjcet,輸入工程名,指定工程所在的文件夾 點(diǎn)擊引導(dǎo)條上的Application公司名,公司名將會(huì)出現(xiàn)在Setup.exe 界面會(huì)切換到ProjectAssistant,我們先從這里開始把工程的基本組件和基本文件建立 在Proje sistant界面的底部,會(huì)有一個(gè)引導(dǎo)動(dòng)作條,在建立該工程的基本結(jié)構(gòu)和文件 報(bào)一個(gè)String_ID1點(diǎn)擊引導(dǎo)條上的Installation點(diǎn)擊引導(dǎo)條上的Installation設(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安裝部分或者全部文檔了。這里我們沒有用到子Feature,用途和普通Feature一樣。這里,建立好所有這里,建立好所有Feature切換到InstallationDesigner找到InstallationDesigner頁面上左邊導(dǎo)航樹Organization|FeaturessFeature有Name和DisplayName兩種名稱,我們剛才改的不過是DisplayName,為了便于查看和使用,我們?cè)谶@里把Name也改一下注意Name繼續(xù)切換回Project點(diǎn)擊引導(dǎo)條上的Application在這里對(duì)安裝路徑進(jìn)行微調(diào),并且為每個(gè)Feature,這里我不想使用ProgramFiles|CompanyName|ProductName這個(gè)路徑 ProgramFiles|ProductName,我直接點(diǎn)擊選中MyProductName[INSTALLDIR]拖動(dòng)到ProgramFileFolder下還可以直接將MyProductName改成自己想要的文件夾名字,接下來,為每個(gè)Feature打開這個(gè)下拉列表,所有的Feature都在這里,按順序來給每一個(gè)Feature建立文件夾,并且,選擇第一個(gè)Feature,即Server,點(diǎn)擊MyProductName[INSTALLDIR]節(jié)點(diǎn) 在菜單上選擇NewFolder來創(chuàng)建一個(gè)文件夾。,創(chuàng)建一個(gè)Server再在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è)置快捷方式點(diǎn)擊選中要添加文件的文件夾,然后點(diǎn)擊右下角的AddFiles接下來我們?yōu)镕eature添加文件夾,如果這個(gè)文件夾中的全部文件都為這個(gè)Feature所需。添點(diǎn)擊選中要添加文件夾的文件夾,然后點(diǎn)擊右下角的AddFolders ludesubfolders選項(xiàng)。如法制為每個(gè)Feature這個(gè)Feature,除了文件所用的圖標(biāo)外,什么都不要添加,后面 點(diǎn)擊引導(dǎo)條上的Application點(diǎn)擊New選擇一個(gè)要建立快捷方式的Feature如果要建立快捷方式的程序?yàn)榉?exe形式,請(qǐng)把FilesOf選擇選為AllFiles(*.*)我們的程序安裝目標(biāo)路徑設(shè)置在ProgramFiles下,因此雙擊[ProgramFilesFolder]我們這里要為client.bat建立一個(gè)快捷方式,因?yàn)檫@個(gè)是啟動(dòng)用的批處理文 Createshortcutin CreateshortcutonDesktopUsealternateshortcutIconAssociateafileextensionwiththeshortcut’starget鉤選第三項(xiàng),并且點(diǎn)擊Browse請(qǐng)回想剛才在為Feature添加文件的時(shí)候,每個(gè)feature都添加了對(duì)應(yīng)的icon。這里,請(qǐng)把瀏覽的文件夾設(shè)定為剛才添加icons所用的文件夾,通俗的說,就是你剛才從哪兒添加一個(gè)圖標(biāo)進(jìn)feature的,現(xiàn)在還是從哪兒添加的這個(gè)圖標(biāo)。進(jìn)來,打包進(jìn)安裝文件才可以。這一點(diǎn)上不能不提一下visualstudio,這個(gè)工具做安裝程序雖如法制為每個(gè)Feature指定快捷方式, 我們?cè)偾袚Q去InstallationDesigner,找到SystemConfiguration|Shortcuts看到快捷方式在開始菜單中是以公司名|軟件名|快捷方式 (不要告訴我你不會(huì)改,直接拖動(dòng)Test文件夾往Program 序”)下一塞即可,然后刪除掉多余的CompanyName文件夾。(可能剛才在ProjectAssistant界面有人已經(jīng)注意到了左邊欄上MoreOptions下Createanuninstallationshortcut這個(gè) 似乎只有在安裝某個(gè)feature的時(shí)候這個(gè)卸載快捷方式才會(huì)出現(xiàn)(當(dāng)然,就是那個(gè)default 的feature形式?jīng)Q定了每個(gè)文件或者快捷方式都必須明確地歸屬到某個(gè)feature下),因此,當(dāng)你的客戶只選擇了其他feature安裝時(shí),這個(gè)卸載方式不會(huì)出現(xiàn),而他必如果你寫使得安裝時(shí)會(huì)拷貝一些外部文件進(jìn)來,那么這些文件在這種卸載方式下是刪除不掉的。(如果你確實(shí)想保存這些文件,你可以在里設(shè)置它們屬性為permanent,這個(gè)屬 點(diǎn)擊引導(dǎo)條上的Application 點(diǎn)擊引導(dǎo)條上的Installation這個(gè)問題當(dāng)時(shí)折騰了我一個(gè)星期(當(dāng)然那時(shí)候才接觸Installshield,還一竅不通),最后問了切換去InstallationDesigner,找到InstallationInformation|GeneralInformation,看到StringTables下面是什么?對(duì),所有你選的語言都列出來了,選中你要的語言,右鍵,選擇MakeDefault,OKProjectAssistant去把所有不要的語言統(tǒng)統(tǒng)去掉鉤選即看到此處,已經(jīng)變成了English為默認(rèn)語言了點(diǎn)擊引導(dǎo)條上的BuildInstallation第二部分:編 協(xié)判斷是否安裝了本軟件所需要的先決軟件JKD1.6.0_04,如無,則啟動(dòng)外部安裝程序進(jìn)行 在安裝結(jié)束時(shí),顯示readme.txt編程這部分都將在InstallerDesignerInstallshield大小寫敏感,因此請(qǐng)嚴(yán)格按照示例上所寫的大小寫規(guī)則來書寫。例:字符串STRING和string都支持,但是String不支持1.顯示軟協(xié)1.添 在左邊導(dǎo)航樹上找到BehaviorandLogic|SupportFiles/Billboards在SupportFilesLanguageIndependent和所有你所選擇的語言類型。LanguageIndependent意為,如果你在這里分支下做了設(shè)置,那么無論選擇用何種語言安點(diǎn)擊LanguageIndependent,這 在右邊的Files欄 ,在彈出菜單上選擇InsertFiles選項(xiàng) 到Files欄中協(xié)議允許兩種文本格式:txt和rtftxt然后切換到BehaviorandLogic|InstallScript中間的導(dǎo)航欄Files下有一個(gè)默認(rèn)的Rul文件Setup.Rul,我們這個(gè)工程的全部installscript代碼都將寫在這個(gè)默認(rèn)文件里點(diǎn)擊選中Setup.Rul節(jié)點(diǎn),右邊會(huì)顯示該文件的可編程面框中選擇BeforeMoveData選項(xiàng),然后在第二個(gè)下拉框中選擇OnBegin選項(xiàng)(不要因?yàn)槟趂unctionOnBegin()的函數(shù)體里面寫代碼來顯示剛才添加的 容,直接把下面的代碼拷貝到OnBegin()函數(shù)的begin和end;之間就可以了DisableSdLicense2("License","","",SUPPORTDIR^"2.txt",Disable SdLicense2("License","","",SUPPORTDIR^"2.txt", SdLicense2(szTitle,szOpt1,szOpt2,szLicenseFile,bLicenseAccepted zOpt1和szOpt2就是這兩個(gè)選項(xiàng),如果填寫空字符串,則會(huì)顯示為默認(rèn)值"Iacceptthetermsofthelicenseagreement"和"IdonotacceptthetermsofthelicenseagreszieseFle可協(xié)議文本放在uotflentlhild即SUOTIR2tx參數(shù)四:bLicenseAccepted,布爾型變量,TRUE狀態(tài),則在協(xié)議界面上默認(rèn)選中的是那個(gè)“同意”的選項(xiàng);不過好像一般更常見的是默認(rèn)選中為“不同意”FA這是協(xié)議的界面。當(dāng)用戶選擇了Iacceptthetermsofthelicenseagreement這個(gè)選項(xiàng)后,Next按鍵可用,安裝程序可以繼續(xù)。(請(qǐng)忽略這里顯示的協(xié)議內(nèi)容…網(wǎng)上有很多軟件協(xié)議的范本供...), ,顯示協(xié)議的函數(shù)一共有三個(gè)SdLicense,SdLicenseRtf和SdLicense2,參數(shù)略有不同,顯示的界面符合大多數(shù)目前流行的安裝界面的。2.判斷是否安裝了本軟件所需要的先決軟件或運(yùn)行環(huán)1代碼還是在OnBegin()函數(shù)體內(nèi)實(shí)現(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é)點(diǎn)為HKEY_LOCAL_MACHINE打 電腦”下的根節(jié)點(diǎn)有HKEY_CLASSES_ROOT,_USER,HKEY_LOCAL_MACHINE等。我們這次要尋找的JDK軟件的 表鍵值在HKEY_LOCAL_MACHINE下,因此要把根鍵設(shè)置為HKEY_LOCAL_MACHINE。 表,開始-〉運(yùn)行-〉輸入命令RegDBKeyExist("SOFTWARE\\JavaSoft\\JavaDevelopmentKit\\1.6.0_04")<判斷是否存在鍵值SOFTWARE\\JavaSoft\\JavaDevelopmentKit\\1.6.0_04,這個(gè)是JDK1.6.0_04安裝時(shí)向 RegDBKeyExistszSubKey);10LaunchAppAndWait(SRCDISK^"jdk\\jdk-6u4-windows-i586-p.exe","",LAAW_OP當(dāng)上面判斷了沒有安裝JDK1.6.0_04jdk文件夾下的jdk-6u4-windows-i586-p.exe安裝程序來安裝。這個(gè)函數(shù)在help里是這樣敘述的LaunchAppAndWait(szProgram,szCmdLine,nOptions參數(shù)一:szProgram,即要啟動(dòng)的程序。這里我們寫入的參數(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é)束后(無論是正常安裝了,還是用戶點(diǎn)擊取消了安裝),安裝 這里在函數(shù)體里面,沒有對(duì)找不到JDK安裝程序,以及安裝出錯(cuò)等情況做判斷。如果用戶有需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是自帶這個(gè)界面的,在安裝過程中用戶可以看到這個(gè)界面,但是這個(gè)界面上的信息是空的,這一點(diǎn)讓人很是疑惑,懷疑是Installshield的bug。因此我們不得不手動(dòng)地實(shí)現(xiàn)這這個(gè)功能需要在OnFirstUIBefore()函數(shù)體中實(shí)現(xiàn),選擇BeforeMoveData|OnFirstUIBefore選項(xiàng)dXXXX都對(duì)應(yīng)著一個(gè)界面,例如 e就是對(duì)應(yīng)著最初開始的歡迎界面。如果開發(fā)對(duì)這些很熟悉,可以在這里對(duì)每一個(gè)界面編程設(shè)置。找到Dlg_SdStartCopy這個(gè)界面選項(xiàng), 在begin6個(gè)feature的名字和兩個(gè)NUMBER類型的變量,即藍(lán)色字串。之前在第一6個(gè)可用的feature6個(gè)feature進(jìn)行一些判斷。在begin字樣后對(duì)這6個(gè)feature賦值,所賦的值就是我們?cè)诘谝徊糠侄x的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里去,這個(gè)list的內(nèi)容稍后會(huì)添加到界面上進(jìn)行顯示Help里對(duì)這個(gè)函數(shù)是這樣描述的:ListAddStringlistID,szStringnPlacementFlag參數(shù)一:listID,需要用戶事先創(chuàng)建一個(gè)list,這里我們看到listStartCopy=ListCreate(STRINGLIST);這句話,即創(chuàng)建了一個(gè)叫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里對(duì)這個(gè)函數(shù)是這樣描述的:FeatureIsItemSelected(szFeatureSource,szFeature);help自帶的例子里寫的MEDIA,就是如果用戶選擇了這個(gè)feature1list里添加一個(gè)關(guān)于該feature的相關(guān)信息即找到UserInterface|在中間的導(dǎo)航樹上找到SdStartCopy這里我們使用的是英文界面,因此點(diǎn)擊選中English選選中這個(gè)界面上的將會(huì)顯示用戶信息的框,把右邊的Visible選項(xiàng)設(shè)置為False即Dlg_SdStartCopy界面里,用戶還可以設(shè)置左上角顯示的標(biāo)題和消息,szTitle";szMsg="";這兩行代碼如果賦值為空,則顯示如圖所示的默認(rèn)信息,用戶可以賦值成自己.,這個(gè)用途常見于配置文件和文件的應(yīng)用,同一程序給不同的用戶,只需要不同的配置和文件。如果將配置和文件每次都打包在安裝程序里,那么變更一個(gè)用戶就需要重新打包一次,這是一個(gè)浪費(fèi)時(shí)間和精力的行為。如果將和配置文件(當(dāng)然內(nèi)容是加密過的)放在,另外,本程序的好幾個(gè)feature用到了相同的庫,如果直接在feature下加庫文件也可以,但是每一個(gè)feature都加一次這個(gè)庫文件夾,整個(gè)安裝程序就會(huì)變得很龐大,因此比較理想的情況是選到了這個(gè)feature的時(shí)候從外部拷貝這些庫文件。這里我們先不包括文檔這個(gè)feature的說明,文檔feature這個(gè)功能需要在OnFirstUIAfter()AfterMoveData|OnFirstUIAfter選項(xiàng),即在選擇了移動(dòng)哪些數(shù)據(jù)后這個(gè)操作生效。之前我們已經(jīng)接觸過了如何判斷是否選擇了某個(gè)Feature,這里也需要判斷是否選擇了某個(gè)Feature,并且根據(jù)這個(gè)Feature來拷貝對(duì)應(yīng)的外部文件function//featureSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGNUMBERSTRINGszTitle,szMsg1,szMsg2,szOption1,NUMBERbOpt1,//featureszFeatureName1szFeatureName2szFeatureName3szFeatureName4szFeatureName5szSrcFile1=szSrcFile2=szTarFolder1=szTarFolder2=對(duì)每一個(gè)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)這個(gè)函數(shù)用于判斷用戶是否選擇了某feature。Help里對(duì)這個(gè)函數(shù)是這樣描述的:FeatureIsItemSelectedszFeatureSource,szFeature);help自帶的例子里寫的MEDIA,就是1,則說明用戶選擇了這個(gè)CopyFile(SRCDISK^szSrcFile1,拷貝文件的函數(shù)。Help里是這樣描述的:CopyFile(szSrcFile,szTargetFile);這個(gè)功能仍然在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);//對(duì)拷貝while(nResult=LongPathToQuote(szDocFile,TRUEParsePath(szDocFileName,szDocFile,FILENAME_ONLY);//對(duì)查找到的文件獲取文件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,從上一次查找的位置開始查找,這個(gè)特性我們呆會(huì)兒會(huì)用到;RESET,從文件夾的開始位置進(jìn)行查找;CANCEL,釋放被上一次的FindAllFiles查找的函數(shù)。在WindowsNT系統(tǒng)下,需要在安裝過程中使用帶CANCEL的FindAllFiles來釋放之前的查找,確保安裝的正確性(因此我懷疑查找有bug,這個(gè)函數(shù)用來彌補(bǔ)這個(gè)bug…)LongPathToQuote(szDocFile,TRUEuote函數(shù)加上這個(gè)文件名上的括號(hào);否則下面一個(gè)函數(shù)無法解析不帶括號(hào)的長(zhǎng)文件名。LongPathToQuote(svPath,nParameter參數(shù)二:nParameterTRUE,為長(zhǎng)文件名加上括號(hào);FALSE,為長(zhǎng)文件名脫去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,要?jiǎng)?chuàng)建的快捷方式所在的文件夾。這里FOLDER_PROGRAMS指開始|所有程序,因此我們的快捷方式將會(huì)出現(xiàn)在開始|所有程序|Test的Docs下;如 參數(shù)三: mnn,全定路的文名或件夾名可包命令參數(shù)這里入剛才查到的件含路件名擴(kuò)展讀可能注到這參數(shù)做了些預(yù)理這個(gè)處也是騰了次才出來不的操系默認(rèn)路也是是否引號(hào)差別這里需要式地定一,以在不操作統(tǒng)上行引起不的結(jié)。參數(shù)四sWrknir,作 Help的解下:設(shè)這個(gè) 為的應(yīng)程序件所在的方要置包了應(yīng)程序的 工作 則可傳個(gè)空符串這個(gè)數(shù)這個(gè)參數(shù)一始我未理其含義不過空字串也出錯(cuò)在來經(jīng)提出要求允用戶自行選是否桌面創(chuàng)建捷方時(shí)無中明這參數(shù)的義請(qǐng)者隨尋找個(gè)自計(jì)算機(jī)上任意置的捷方式 擇屬性個(gè)szoknir就是性面上的起始位置值為個(gè)快方式指的用程所在文夾的路。至在我驗(yàn)的序里創(chuàng)建開始單的捷方和桌快捷式,個(gè)參要的值還略有同的開始單里建可以直傳空符而面快方控字串是會(huì)出看屬面板的起位置”參數(shù)六:nIcon。如果不是使用Windows0;Windows圖標(biāo)我沒有研參數(shù)七:szShortCutKey,熱鍵,一般用不到。如果有需要可以設(shè)置為比如"Ctrl+Alt+參數(shù)八:nFlag,靜態(tài)變量,多個(gè)用途。這個(gè)程序里我們使用了REPLACE,即使用當(dāng)前這個(gè)快捷方式的屬性;RUN_IZED,當(dāng)從這個(gè)快捷方式登錄程序時(shí),程序界面最大化;R成刻錄大光盤,從VCD盤改成DVD盤。這段代碼在用戶選擇了安裝文檔的條件下,對(duì)外部文 的文件創(chuàng)建快捷方式,這個(gè)難點(diǎn)在于8個(gè)參數(shù)的理解。我在互聯(lián)網(wǎng)上搜索了一陣子,并且啃了一陣子help,但是可能自己外語水平不是很過關(guān),以至于第四個(gè)參數(shù)沒有完全理解到整個(gè)安裝程序做下來這一段代碼是最難的,F(xiàn)indAllFiles在Help里解釋是當(dāng)碰到第一個(gè)符合條件的文件就會(huì)停下來,因此如何全部文件,并且獲取文件信息,代碼的撰寫也是費(fèi)了很大的在安裝結(jié)束時(shí),顯示readme.txt文這是個(gè)很有用的設(shè)置但是在InstallScript工程里不是默認(rèn)自帶的因此也需 這段代碼的位置是在AfterMoveData|OnFirstUIAfter()首先,在安裝的時(shí)候把readme.txt文件從源盤拷貝到安裝下。把這段代碼拷貝到AfterMoveData|OnFirstUIAfter()的begin和end;之間即可。README.TXT文件放置在源盤的根下,并且在安裝時(shí)拷貝到安裝下。創(chuàng)建一個(gè)Finish界面,并在界面上設(shè)置詢問是否顯示readme.txt文件的選項(xiàng)之前我們看到當(dāng)我們第一次選取了AfterMoveData|OnFirstUIAfter()選項(xiàng)時(shí),系統(tǒng)會(huì)為這個(gè)就是結(jié)束界面。Installscript工程默認(rèn)安裝完畢后,界面直接 inish按鈕的界面讓用戶點(diǎn)擊了以后才結(jié)束整個(gè)安裝過程。這段代碼就是創(chuàng)建了一個(gè)Finish界面了,我們要對(duì)這段代碼進(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í)行這個(gè)OnFirstUIAfter()的代碼,如果參數(shù)為BACK,則逆序返回參數(shù)所關(guān)聯(lián)的字符串值,這個(gè)參數(shù)應(yīng)當(dāng)是一個(gè)資源IDSdFinishEx(szTitle,szMsg1,szMsg2,szOption1,szOption2,bOpt1,參數(shù)一:szTitle,即顯示在界面上的左上角的標(biāo)題,如果傳空值,則顯示默參數(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)。if(bOpt1=TRUE)if(FindFile(TARGETDIR,"README.TXT",szDocFile)=0)為了保險(xiǎn)起見,需要進(jìn)一步判斷一下這個(gè)readme.txtFindFile(szPath,szFileName,svResult參數(shù)二:szFileName,文件名,包含擴(kuò)展參數(shù)三:szDocFile,返回的文件LaunchApp(WINDIR^"Notepad.exe",TARGETDIR^"README.TXT"打開readmeHelp里沒有對(duì)這個(gè)函數(shù)的專門的解釋,但是有個(gè)例子,以至于我看了好幾遍才看懂要表達(dá)的意 一下Windows下自帶的程序Notepad.exe,路徑為WINDIR^"Notepad.exe"。如果是一些不是Windows自帶的程序,比如PDF,DOC,還需要從 小結(jié):這個(gè)界面我曾經(jīng)試圖寫在OnFirstUIBefore()里的結(jié)尾部分,用Dlg_SdFinish來實(shí)現(xiàn), 實(shí)我本人是比較討厭結(jié)束的時(shí)候有這么一個(gè)要看readme的選項(xiàng)的,一般自己裝到這種軟件,都是去掉鉤選框,不看readme的;但是如果直接結(jié)束掉,不出這個(gè)結(jié)束界面又覺得提示不足,有時(shí)候不能確定安裝程序有沒有結(jié)束,所以私下里還是比較想去掉readme選項(xiàng),而直接顯示一個(gè)只有一個(gè)finish按鈕的界面的。在安裝結(jié)束時(shí),允許用戶選擇是否顯示桌面快捷方 checkb這段代碼的位置是在AfterMoveData|OnFirstUIAfter()的函數(shù)里實(shí)現(xiàn)的,也就是和“顯示readme文件”的功能放在一起。把從Disable(STATUSEX);起到SdFinishEx這行的代碼,全部替換成如下代碼bOpt1=bOpt2=szMsg1=szOption1="ShowszOption2="CreateShortcutonSdFinishEx(szTitle,szMsg1,szMsg2,szOption1,szOption2,bOpt1,與上面的“顯示readme文件”中的代碼相比,只動(dòng)了一個(gè)地方,即szOption2="CreateShortcutonDesktop?";這個(gè)是一個(gè)CheckboxCheckbox并且在這個(gè)Checkbox旁邊顯示這個(gè)所賦的簡(jiǎn)短值。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ù)里的第三個(gè)參數(shù)被做了一些預(yù)處理,這個(gè)處理也是折騰在安裝結(jié)束后,啟動(dòng)指定的程這部分很明顯是要在安裝全部結(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)用戶選擇了這個(gè)featureif(FindFile(TARGETDIR,"watch.exe",szDocFile)=0) e。當(dāng)該文件存在時(shí),返回值為0if(LaunchApp(serviceTarget,"")<0)這里L(fēng)aunchApp6段的用法略有不同。這個(gè)函數(shù)的本意是啟動(dòng)第一個(gè)參數(shù)指MessageBox("Unabletolaunch"+serviceTarget+".", 不友好;現(xiàn)在在安裝完畢后做到了靜默啟動(dòng),用戶無需做任何事情。而且這個(gè)服務(wù)需要JDK的支持,配合上述第2段中判斷是否安裝了JDK這個(gè)應(yīng)用,就不會(huì)出現(xiàn)安裝了此服務(wù)但是無法運(yùn)安裝結(jié)束后,為JDK設(shè)置一個(gè)環(huán)境變之前提到了,要在安裝本系統(tǒng)時(shí)判斷是否安裝了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是否被安裝,只有通過 因?yàn)樵O(shè)置JAVA_HOME環(huán)境變量需要JDK的安裝位置,所以要根據(jù) 位置,而幸運(yùn)的是,該鍵值下的JavaHome鍵名所對(duì)應(yīng)的值就是JDK的安裝位置。RegDBGetKeyValueEx(szKey,szName,nvType,svValue,nvSize參數(shù)一:szKey,要查找的 表的鍵,這里我們查找SOFTWARE\\JavaSoft\\JavaDevelopmentKit\\1.6.0_04參數(shù)二:szName,一些表鍵下面會(huì)有一些鍵名,如果你去看一下我們查找的鍵,會(huì)發(fā)現(xiàn)該鍵下存在多個(gè)鍵名,這里我們只要查找JavaHome鍵名對(duì)應(yīng)的值,因此,指定szNameJaREGDB_STRING,結(jié)果編譯出錯(cuò),參數(shù)四:svValue,返回該鍵名對(duì)應(yīng)的參數(shù)五:nvSize,返回該鍵名對(duì)應(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來實(shí)現(xiàn)的,這個(gè)鍵是一個(gè)特殊"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í),都可以設(shè)置該值為-1,installshield會(huì)自動(dòng)為我們計(jì)算正確的長(zhǎng)度,而當(dāng)鍵類型為REGDB_BINARY和REGDB_STRING_MULTI時(shí),就必須傳該鍵值的實(shí)小結(jié):Installshield默認(rèn)鍵值位置是在HKEY_CLASSES_ROOT下的,因此在這里,我們需要在進(jìn)行搜索鍵值和設(shè)置鍵值的操作之前使用RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);這句話來設(shè)置一下默認(rèn)的根鍵值為HKEY_LOCAL_MACHINE;另,在網(wǎng)上看了一個(gè)帖 者說當(dāng)時(shí)為了解決這個(gè)問題,是在代碼頭加上DISABLE(LOGGING);代碼尾加上ENABLE(LOGGING)來實(shí)現(xiàn)的,雖然我沒有碰到這個(gè)問題,但是還是很感謝這位作者,因?yàn)楫?dāng)時(shí)他也說了,根本找不到資料,自己啃了天書般的HELP來解決, 完美卸9點(diǎn)我們提到過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)建的安裝文件在安裝時(shí)總會(huì)在這個(gè)文件夾里創(chuàng)建對(duì)應(yīng)信息,一長(zhǎng)串?dāng)?shù)字型序列碼就是安裝程序的ProductID。利用這個(gè)setup.exe就可以進(jìn)行反安裝參數(shù)二:/UNINSTALL,告訴程序啟動(dòng)這個(gè)setup.exe時(shí)為非安裝狀態(tài),即修復(fù)、重新安裝和"C:\ProgramFiles\InstallShieldInstallationInformation\{0D9DF66A-44E5-4754-A522-2AD6C9D5CDBE}\setup.exe"-runfromtemp-l0x0409/UNINSTALLnresult=尋找到“.exe”這個(gè)字符串在szfilename這個(gè)字符串中的位置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下的長(zhǎng)文件名就有這個(gè)缺szfilename="\""+szmsg1+"\""||Testifendif;代碼看上去簡(jiǎn)直就是多此一舉。在Installshield7之前,一直是這樣寫的:szfilename=UNINSTALL_STRING+"從Installshield8開始,長(zhǎng)文件名一直有引號(hào)封閉不正確的問題,因此ifendif;代碼完全是為 emove即可進(jìn)行卸載。中所有從安裝程序中安裝的文件都卸載掉,包括安裝時(shí)從外部拷貝的文件。利用Proje stant創(chuàng)建的卸載快捷方式則無法卸載掉安裝時(shí)從外部拷貝的文件。完美卸載之卸載時(shí)觸發(fā)命令(卸載Windows服務(wù)里(參閱第二部分的第8小節(jié)),在安裝完畢后,啟動(dòng)了一個(gè)指定程序,這個(gè)指定程序干的事情就是向Windows寫了一個(gè)服務(wù)進(jìn)去(有 的同學(xué)可以去看看JavaService相關(guān)資料,是一個(gè)把Java程序 為Windows服務(wù)的一個(gè)工具或者說是組件更合適些);所以,這里希望首先我們介紹一下兩條WindowscmdSCstop這條命令用于停止某個(gè)名叫XXX的正在運(yùn)行的Windows服SCdelete這條命令用于刪除某個(gè)名叫XXX的Windows服一開始思路是這樣的,獲取安裝程序的卸載狀態(tài),然后調(diào)用這兩條命令來刪除服務(wù);沒想到szfilename=UNINSTALL_STRING+"/UNINSTALL";這句話改成szfilename=UNINSTALL_STRING+"后來想在Onbegin里添加一個(gè) ategoryid=7ategoryid=7,這里面其實(shí)是談反安裝時(shí)候不執(zhí)行OnMaintUIBefore函數(shù)的問題, 于是打開BeforeMoveData|這里就運(yùn)用了一個(gè)函數(shù)LaunchAppAndWait來達(dá)到目的。其實(shí)一開始我還在想是不是要寫批LaunchAppAndWait(szProgram,szCmdLine,nOptions參數(shù)一:szProgram,要運(yùn)行的程序。在Help里有這樣一句解釋:想在命令行里指定要運(yùn)行參數(shù)三:靜態(tài)變量,操作類型,這里L(fēng)AAW_OPTION_HIDDEN可以使批處理窗口隱藏掉,如 Installshield原始安裝界面我始終覺得很丑,幸好Installscript InstallationDesigner的左邊導(dǎo)航樹上找到UserInterface|Dialogs|Skins選項(xiàng)下面顯示了不同的界面風(fēng)格,默認(rèn)是None,選擇一個(gè)喜好的風(fēng)格即可,筆者一般使用Blue或BlueTC,適用于一般商業(yè)軟件的穩(wěn)2.。1第一步,指定一個(gè)打包的配置版本,如果使用同一個(gè)安裝程序源來打包成不同的配置,就可 過濾設(shè)置,筆者從來沒用過。貌似是對(duì)feature的一些設(shè)置參數(shù),大概是針對(duì)某些版本,如果某些feature不需要的話,就直接過濾掉軟件比如Oracle4安裝程序的語言和被安裝的應(yīng)用程序的語言沒有必然聯(lián)系,因此這里還需要設(shè)置一下安裝時(shí)決于在做安裝程序時(shí)選擇的語言,剛才我們只選擇了English,因此這里只顯示English了。 Automatic會(huì)自動(dòng)為你檢測(cè)所需光盤的規(guī)格數(shù)量,以及制作出光盤77.這個(gè)選項(xiàng)指定了打包時(shí)的形態(tài)Compressallfiles:所有的文件都?jí)嚎s打包(這里不包括 的文件,只包括在Proje sistant里指定到各個(gè)feature下的文件Leavefiles pressedandseparatefromtheinstallationpackage:所有的文 是否要包括.NETFramework,Installshield\MyProjectName\ProductConfigurationX\ReleaseX\DiskImages\DISK1下品的印象打折扣的??梢允褂肍lash或者其 之前在第二部分的第九小節(jié)里提到了安裝完畢后,為JDK設(shè)置一個(gè)環(huán)境變量,事實(shí)上這個(gè)文檔但是,很快發(fā)現(xiàn)了新問題,在表里添加環(huán)境變量和在桌面上“電腦”里直接添加環(huán)境變量是不一樣的;表里的操作,都需要通過重啟動(dòng)計(jì)算機(jī)來使之生效,所以出現(xiàn)了:當(dāng)這個(gè)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è)計(jì)者,在這篇文檔里,三個(gè)地方用到了LaunchApp這個(gè)函數(shù),而且每個(gè)處理文件,批處理接收到JDK路徑后,便可以正確啟動(dòng)了。這個(gè)問題其實(shí)和JavaSerive以及操作系統(tǒng)相關(guān);因?yàn)樵诠P者的計(jì)算機(jī)上一直沒有發(fā)現(xiàn)這個(gè)問Path的問題,只要在Path里添加上JRE的Bin文件路徑,這個(gè)服務(wù)就可以正確啟動(dòng)了。因?yàn)闆]有深入了解JavaSerive的運(yùn)行機(jī)制和Windows服務(wù)的運(yùn)行機(jī)制,也沒有深究為什么了,猜內(nèi)容中添加JRE路徑,并且要考慮內(nèi)容之間的分號(hào)問題l要考慮到卸載狀態(tài)時(shí),不能把Path卸載。說到這個(gè)問題,要提一下前面的第九小節(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;//如果沒有這個(gè)鍵值,把值也直接添加進(jìn)去,事實(shí)上這個(gè)情況也不會(huì)出現(xiàn),因?yàn)閜ath在操作系統(tǒng)安裝完畢后就存在了,//除非你手動(dòng)刪除了,但是那樣操作系統(tǒng)也會(huì)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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論