Installshield打包學習記錄
個人工作學習的一點點記錄,可能有不專業的表述,各位可以提出建議,共同學習。
目錄
- Installshield打包學習記錄
- 一、Installshield的幾個事件:
- 1. Before Move Data(安裝數據前)
- 1.1 OnFirstUIBefore
- 2. Move Data(安裝數據過程中)
- 2.1 OnGeneratingMSIScript
- 2.2 OnGeneratedMSIScript
- 2.3 OnInstallFilesActionBefore
- 2.4 OnInstallFilesActionAfter
- 2.5 OnMoving
- 2.6 OnMoved
- 3. After Move Data(安裝數據后)
- 3.1 OnFirstUIAfter
- 3.2 OnMaintUIAfter
- 3.3 OnEnd
- 二、Installshield打包過程中的問題
- 1. 錯誤6003
- 2. 錯誤1014
- 3. 錯誤7132
- 三、可能用到的bat復制執行腳本
- 1. 復制文件到指定路徑
- 2. 利用腳本安裝下載的字體
一、Installshield的幾個事件:
下面介紹幾個重要的事件,事件分為三大類:
1. Before Move Data(安裝數據前)
1.1 OnFirstUIBefore
就是在第一次安裝時,在復制安裝數據之前觸發的事件,更改這個事件的腳本可自定義安裝步驟。
例如,我們可以在這里自定義去設定先彈出軟件安裝歡迎界面、用戶注冊、安裝位置的選擇、以及安裝模式的定義等等。
舉個例子:
function OnFirstUIBefore()NUMBER nResult, nSetupType, nvSize, nUser, nExclusiveType, nNeutrValue, nLength;STRING szConfigXmlPath, szTitle, szMsg, szQuestion, svName, svCompany, szFile, szDeviceType, szText1, szText2, szText3, szText4, szText5, szValueBuf;STRING szLicenseFile;STRING szLanguageCode, szCurUse, szCurInstru;BOOL bCustom, bIgnore1, bIgnore2, bCheck1, bCheck2, bCheck3, bCheck4, bNeutralVer;
begin // TO DO: if you want to enable background, window title, and caption bar title // 歡迎界面
Dlg_SdWelcome:szTitle = "";szMsg = "";nResult = SdWelcome(szTitle, szMsg); if (nResult = BACK) goto Dlg_SdWelcome;// 安裝位置自定義
Dlg_SdAskDestPath:szMsg = ""; nResult = SdAskDestPath(szTitle, szMsg, INSTALLDIR, 0);if (nNeutrValue = 0) then elseif (nResult = BACK) goto Dlg_SdWelcome; endif;// 開始安裝復制數據
Dlg_SdStartCopy:szTitle = "";szMsg = "";nResult = SdStartCopy2( szTitle, szMsg );if (nResult = BACK) thengoto Dlg_SdAskDestPath;endif;SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_FIRSTUI ) );// setup default statusEnable(STATUSEX);return 0;
end;
2. Move Data(安裝數據過程中)
這個類型當中的事件一般來說不需要改動。在這里可以做一些軟件安裝的必需工作,比如你的軟件需要mysql數據庫支持,但安裝的電腦上有沒有,此時我們把mysql數據庫的安裝包和執行安裝的腳本打包進項目,讓腳本替我們在這個時候去復制移動,去執行就可以了。
還是舉個例子:
function OnMoved() STRING szMySqlBatPath, szConfigXmlPath,szMyFontPath, szMyFontBatPath, szMyAppFontPath, szResult, szMyDatabaseBatPath; NUMBER nNeutrValue;
begin if( !MAINTENANCE ) then// copy MySQL57 to C:szMySqlBatPath = APPINSTALLDIR + "\\" + szCopySQLScriPath;LaunchAppAndWait(szMySqlBatPath, "", LAAW_OPTION_WAIT | LAAW_OPTION_HIDDEN); endif; end;
2.1 OnGeneratingMSIScript
在Action(動作) :LauchConditions之前執行;
2.2 OnGeneratedMSIScript
在Action(動作) LauchConditions之后執行;
2.3 OnInstallFilesActionBefore
在Action(動作) InstallFiles之前執行;
2.4 OnInstallFilesActionAfter
在Action(動作) InstallFiles之后執行;
2.5 OnMoving
在Action(動作) InstallInitialize之后執行;
2.6 OnMoved
在Action(動作) GeneratedMSIScript之前執行;
3. After Move Data(安裝數據后)
3.1 OnFirstUIAfter
在第一次安裝時,在復制安裝數據之后觸發的事件,例如有一個系統需要將安裝路徑設置FTP虛擬目錄,如果在安裝數據之前就設置的話,該路徑不存在,無法設置成功,因此需要在這個事件中設置。
function OnFirstUIAfter()STRING szTitle, szMsg1, szMsg2, szOpt1, szOpt2;NUMBER bOpt1, bOpt2;
beginDisable(STATUSEX);bOpt1 = FALSE;bOpt2 = FALSE; if ( BATCH_INSTALL ) thenSdFinishReboot ( szTitle , szMsg1 , SYS_BOOTMACHINE , szMsg2 , 0 );elseSdFinish ( szTitle , szMsg1 , szMsg2 , szOpt1 , szOpt2 , bOpt1 , bOpt2 );endif; end;
3.2 OnMaintUIAfter
在修改或卸載時,在修改或卸載數據之后觸發的事件;這個時候比如確認執行卸載后,我們就可以清除軟件安裝目錄信息:
function OnMaintUIAfter()STRING szTitle, szMsg1, szMsg2, szOpt1, szOpt2, szAPPInstallDir;NUMBER bOpt1, bOpt2, nBufferSize;
beginDisable(STATUSEX);if( REMOVEALLMODE ) then szTitle = SdLoadString(IFX_SDFINISH_REMOVE_TITLE);szMsg1 = SdLoadString(IFX_SDFINISH_REMOVE_MSG1); // Del AppPath DeleteDir(APPINSTALLDIR, ALLCONTENTS); elseszTitle = SdLoadString(IFX_SDFINISH_MAINT_TITLE); szMsg1 = SdLoadString(IFX_SDFINISH_MAINT_MSG1);endif;bOpt1 = FALSE;bOpt2 = FALSE; if ( BATCH_INSTALL ) thenSdFinishReboot ( szTitle , szMsg1 , SYS_BOOTMACHINE , szMsg2 , 0 );else SdFinish ( szTitle , szMsg1 , szMsg2 , szOpt1 , szOpt2 , bOpt1 , bOpt2 );endif;
end;
3.3 OnEnd
這個就是在軟件安裝后來進行觸發的時間(在點擊“完成”按鈕之后觸發),比如利用腳本方式創建數據庫,即可以在這部分進行完成:
function OnEnd()STRING szMySqlBatPath, szResumeConfigPath, szResult, szConfigAppPath, szPreAPPInstallDir; NUMBER nBufferSize;
begin if ( MAINTENANCE ) then// Resume Config Files // Look up Preinstall Path nBufferSize = 1024; MsiGetProductInfo(PRODUCT_GUID, INSTALLPROPERTY_INSTALLLOCATION, szPreAPPInstallDir, nBufferSize);szResumeConfigPath = szPreAPPInstallDir ^ szApplicationName + "\\" + szResumeScriPath;LaunchAppAndWait(szResumeConfigPath, "", LAAW_OPTION_WAIT | LAAW_OPTION_HIDDEN); else // Totol Install Execute Sql Script mysql-intit.batszMySqlBatPath = szMySqlPath + "\\" + szProgram;LaunchAppAndWait(szMySqlBatPath, "", LAAW_OPTION_WAIT | LAAW_OPTION_HIDDEN); // Run db_install_startup.bat if FindFile(APPINSTALLDIR , szInitDatabasePath, szResult) = 0 thenszMyDatabaseBatPath = APPINSTALLDIR + "\\" + szInitDatabasePath;LaunchAppAndWait(szMyDatabaseBatPath, "", LAAW_OPTION_HIDDEN); endif; endif;end;
二、Installshield打包過程中的問題
1. 錯誤6003
這個錯誤可能是因為項目的一些必要的包沒有下載,需要重新下載即可
2. 錯誤1014
這個問題比較好解決一些,一般來講,在你進行build的時候,不要打開需要打包的文件夾中的某個文件,被占用則會報這個錯誤(build的時候不要打開Setup.exe所在的文件夾)
3. 錯誤7132
出現這個問題的原因,則有可能是:
- 當構建具有以下兩個元素的基本MSI項目時,可能會發生此錯誤:
– 版本的Build選項卡下的UI Languages設置包含了不支持的語言InstallScript
– 該項目包含一個InstallScript類型的Custom Action
三、可能用到的bat復制執行腳本
1. 復制文件到指定路徑
::被復制的文件夾
set tarDir=
::文件名
set filename=db_install_startup.bat::判斷文件夾是否存在
if not exist %tarDir% {::創建目錄mkdir %tarDir%
}::復制文件,并重定向輸出
copy %filename% %tarDir%%filename% > nul::判斷是否執行成功
if "%errorlevel%"=="0" {echo Copy successfully
} else {echo Copy failed
}
其實用XCopyFile進行文件夾拷貝只需要一句話:
nResult = XCopyFile("C:...//SrcDir//*.*","C:...//TargetDir//*.*",COMP_NORMAL);
2. 利用腳本安裝下載的字體
@echo off
::字體所在完整路徑
set "zt=D:\SourceHanSansSC-Regular.ttc"
::安裝字體
mshta "javascript:new ActiveXObject('Shell.Application').NameSpace(20).CopyHere('%zt:\=\\%',0x0010);close()"
pause