Installshield打包学习记录
个人工作学习的一点点记录,可能有不专业的表述,各位可以提出建议,共同学习。
一、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
else
if (nResult = BACK) goto Dlg_SdWelcome;
endif;
// 开始安装复制数据
Dlg_SdStartCopy:
szTitle = "";
szMsg = "";
nResult = SdStartCopy2( szTitle, szMsg );
if (nResult = BACK) then
goto Dlg_SdAskDestPath;
endif;
SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_FIRSTUI ) );
// setup default status
Enable(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;
begin
Disable(STATUSEX);
bOpt1 = FALSE;
bOpt2 = FALSE;
if ( BATCH_INSTALL ) then
SdFinishReboot ( szTitle , szMsg1 , SYS_BOOTMACHINE , szMsg2 , 0 );
else
SdFinish ( 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;
begin
Disable(STATUSEX);
if( REMOVEALLMODE ) then
szTitle = SdLoadString(IFX_SDFINISH_REMOVE_TITLE);
szMsg1 = SdLoadString(IFX_SDFINISH_REMOVE_MSG1);
// Del AppPath
DeleteDir(APPINSTALLDIR, ALLCONTENTS);
else
szTitle = SdLoadString(IFX_SDFINISH_MAINT_TITLE);
szMsg1 = SdLoadString(IFX_SDFINISH_MAINT_MSG1);
endif;
bOpt1 = FALSE;
bOpt2 = FALSE;
if ( BATCH_INSTALL ) then
SdFinishReboot ( 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.bat
szMySqlBatPath = szMySqlPath + "\\" + szProgram;
LaunchAppAndWait(szMySqlBatPath, "", LAAW_OPTION_WAIT | LAAW_OPTION_HIDDEN);
// Run db_install_startup.bat
if FindFile(APPINSTALLDIR , szInitDatabasePath, szResult) = 0 then
szMyDatabaseBatPath = 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