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