Installshield软件项目打包学习

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值