InstallShield详细制作说明(三)
八、许可协议
打开【Installation Designer】->【Behavior and Logic】->【Support Files/Billboards】面板
这里【Language Independent】是指的设置将在任何语言下都会起作用相当于默认,下面还有【中文(简体)】,就相当于分支,只有中文下起作用。这里我们就只做通用的,在【Language Independent】,添加“软件许可协议.txt”文件。
然后,再点击【Disk1】,这里我们存放一些运行系统所需的先决条件,这些文件是不会打包到setup.exe里面,而是跟setup.exe平级的,因为这些条件不是每台机器都需要的,也不属于产品内的东西。
九、安装脚本
这部分是最复杂,也是最重要的。打开【Installation Designer】->【Behavior and Logic】->【InstallScript】面板
脚本事件主要有三大类:Before Move Data(安装数据前)、Move Data(安装数据过程中)、After Move Data(安装数据后)。
OnBegin:在初始化后,被调用
OnFirstUIBefore:第一次安装时,在复制安装数据之前触发的事件,更改这个事件的脚本可自定义安装步骤(一般我们都是修改这个)
OnMainUIBefore:在修改或卸载时,在复制安装数据之前触发的事件,例如安装程序在安装时添加了服务,在卸载时安装程序不会将此服务反安装,这就需要脚本删除服务。
OnSQLLogin:Ms SQL SERVER数据库安装登录函数。
MoveData:一般很少有人会去改
OnFirstUIAfter: 第一次安装时,在复制安装数据之后触发的事件,例如有些地方需要设置路径,在安装前路径不存在,必须安装后才能设置。
OnMainUIAfter: 在修改或卸载时,在修改或卸载数据之后触发的事件
OnEnd:在安装完成之后触发的事件,即点击【完成】按钮后触发的事件。
我们先写许可协议界面,可以看到现在脚本是空的。在右侧,将下拉列表选为【BeforeMoveData】【OnBegin】。这里注意不要看当前是OnBegin,就不选了,一定要选一下,才会触发代码生成。begin与end之间的内容就是我们要具体要执行的动作了。
function OnBegin()
begin
//禁用上一步
Disable(BACKBUTTON);
//判断安装程序处于何种状态,安装、修复、重新安装或卸载状态,后三者属于MAINTENANCE状态,因此判断只有在正常安装的状态下才显示许可协议
if(!MAINTENANCE)then
//TRUE表示默认选中接受协议
SdLicense2("软件许可协议","","",SUPPORTDIR^"软件许可协议.txt",TRUE);
endif;
end;
SdLicense2(szTitle,szOpt1,szOpt2,szLicenseFile,bLicenseAccepted);
参数szTitle: 界面左上角的标题,填””则默认为”License Agreement”
参 数szOpt1、szOpt2:两个选项“同意”和“不同意”。默认值“I accept the terms of the license agreement”和“I do not accept the terms of the license agreement”
参数 szLicenseFile:指定需要显示的文档,包含路径和带扩展名的文档名。“软件许可协议.txt”上面放在了supportfile下了,这个路 径在Installshield里有专门的静态变量,即SUPPORTDIR,后面再加上文件名,用^来连接,文件名需要加引号
这 里细说一下SdLicense2,这个你可以去【User Interface】->【Dialogs】,下面了一堆的对话框,你也可以自定义对话框。所以上面SdLicense2直接就是对话框的名字,这 种用法就跟构造器一样,那参数呢,你可以看到对话框右侧下方,有简单说明,你点击那个链接就会打开API文档了,那里会详细解释每个字段的含义。
下面在OnFirstUIBefore中添加先决条件和安装路径,点击下拉列表生成代码
如 果上面你已经试过编译,你会发现安装的步骤还挺多的,其实每一个步骤都对应着生成的代码中的Dlg_XXXXXX,有很多可能你都不需要的,下面是我修改 后的代码。主要就是检查是否安装了NetFramework,MySQL,没有则安装,另外就是让用户指定要安装的Feature。Dlg_XXXXXX 是按顺序执行的,当然你也可以看到通过goto可以跳转。
function OnFirstUIBefore()
NUMBER nResult, nSetupType, nvSize, nUser;
STRING szTitle, szMsg, szQuestion, svName, svCompany, szFile;
STRING szLicenseFile;
BOOL bCustom, bIgnore1, bIgnore2;
STRING SETUPEXEDIR[MAX_PATH + 1]; //获取安装程序Setup.exe自身所在的路径
NUMBER nBuffer; // local buffer-size variable
STRING svMsiexec,svMsiPackage,svParam;
begin
if( REMOVEONLY ) then
Disable( DIALOGCACHE );
szMsg = SdLoadString( IDS_IFX_ERROR_PRODUCT_NOT_INSTALLED_UNINST );
SdSubstituteProductInfo( szMsg );
MessageBox( szMsg, SEVERE );
abort;
endif;
nSetupType = TYPICAL;
Dlg_SdWelcome:
szTitle = "";
szMsg = "单击'下一步',将安装XX产品,如果有先决条件未安装,将会先安装先决条件";
nResult = SdWelcome(szTitle, szMsg);
if (nResult = NEXT) then
//检查先决条件
//设置默认的注册表键值根节点为HKEY_LOCAL_MACHINE
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
MsiGetProperty(ISMSI_HANDLE, "SETUPEXEDIR", SETUPEXEDIR, nBuffer);
//判断.netFramework 4.0
if(RegDBKeyExist("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full")<0) then
if(LaunchAppAndWait(SETUPEXEDIR^"dotNetFx40_Full_x86_x64.exe","",LAAW_OPTION_WAIT)<0)then
MessageBox("安装NetFramework4.0失败",INFORMATION);
endif;
else
//MessageBox("系统已安装NetFramework4.0",INFORMATION);
endif;
//判断MySQL
if(RegDBKeyExist("SOFTWARE\\MySQL AB")<0) then
if(LaunchAppAndWait(SETUPEXEDIR^"install_mysql.bat","",LAAW_OPTION_WAIT)<0)then
MessageBox("安装MySQL失败",INFORMATION);
endif;
else
// MessageBox("系统已安装MySQL",INFORMATION);
endif;
goto Dlg_SdFeatureDialog;
endif;
Dlg_SdFeatureDialog:
szTitle = "";
szMsg = "";
nResult = SdFeatureDialog(szTitle, szMsg, INSTALLDIR, "");
if (nResult = BACK) goto Dlg_SdWelcome;
// Added in IS 2009 - Set appropriate StatusEx static text.
SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_FIRSTUI ) );
// setup default status
Enable(STATUSEX);
return 0;
end;
上面调用mysql的时候用的bat间接调用的,msi貌似能直接调用,但是我试了很多,没有试出来,如果试出来请告知。
这里我并没有研究太多的脚本代码,只是基本上实现了自己的需求,把一些难点都用database.exe的方式去实现了,不得不承认研究这个真的很头疼,需要深入研究的同仁,可以多学习。
InstallShield详细制作说明(三)的更多相关文章
- InstallShield详细制作说明(一)
虽然网上关于InstallShield的制作说明已经很多,但是看的时候还是会有些晕乎乎的,不得不说很复杂.前段时候做了一次,后面需要升级,在重新做的时候发现有些地方自己又忘了,所以有必须将自己看的教程 ...
- InstallShield详细制作说明(四)
十.编译打包
- InstallShield详细制作说明(二)
四.设置安装的组件Component
- 用AE如何制作如下三个loading动效,
在本期象牙绘UED团队分享当中,我们将详细演示用AE如何制作如下三个loading动效, 其中涉及到AE表达式的应用.值曲线调整.速度曲线编辑等知识. 对于初学者来说可能信息量略大,希望通过是视频教程 ...
- WebRTC VideoEngine超详细教程(三)——集成X264编码和ffmpeg解码
转自:http://blog.csdn.net/nonmarking/article/details/47958395 本系列目前共三篇文章,后续还会更新 WebRTC VideoEngine超详细教 ...
- SQL Server 2008 R2 性能计数器详细列表(三)
原文:SQL Server 2008 R2 性能计数器详细列表(三) SQL Server,Deprecated Features 对象: 监视指定为不推荐使用的功能: SQL Server Depr ...
- jquery jtemplates.js模板渲染引擎的详细用法第三篇
jquery jtemplates.js模板渲染引擎的详细用法第三篇 <span style="font-family:Microsoft YaHei;font-size:14px;& ...
- WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式
原文:WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式 由于WPF中没有提供PropertyGrid控件,有些业务需要此类的控件.这篇文章介绍在WPF中实现PropertyGr ...
- InstallShield 12 制作安装包
目 录 一. 二. 三. (一) 打开project... 2 (二) project助手页面... 3 1.Application Information:程序信息... 4 2.Installa ...
随机推荐
- ArcGIS api for javascript——用缓存区查询地图
描述 本例展示了如何在另外一个任务里使用一个任务的结果.单击地图查看被单击的点的1公里范围内的缓存(如果需要可以修改这个默认的缓存距离).也可以看缓存区的这些点的人口普查街区信息.单击一个点查看更多的 ...
- ImageLoader的简单分析(二)
在<ImageLoader的简单分析>这篇博客中对IImageLoader三大组件的创建过程以及三者之间的关系做了说明.同一时候文章的最后也简单的说明了一下ImageLoader是怎么通过 ...
- ZOJ 2588 Burning Bridges(无向连通图求割边)
题目地址:ZOJ 2588 由于数组开小了而TLE了..这题就是一个求无向连通图最小割边.仅仅要推断dfn[u]是否<low[v],由于low指的当前所能回到的祖先的最小标号,增加low[v]大 ...
- thinkphp5项目--企业单车网站(三)
thinkphp5项目--企业单车网站(三) 项目地址 fry404006308/BicycleEnterpriseWebsite: Bicycle Enterprise Websitehttps:/ ...
- JavaScript 与Document
JavaScript JavaScript 是脚本语言, 需要有宿主文件, 他的宿主文件是HTML文件. 可以写在head中 body中 和</heml>之后 一般写在< ...
- 洛谷P4051 [JSOI2007]字符加密
题目描述 喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法. 例如‘JSOI07’,可以读作 ...
- codeforces 710C Magic Odd Square(构造或者n阶幻方)
Find an n × n matrix with different numbers from 1 to n2, so the sum in each row, column and both ma ...
- C#中如何获得两个日期之间的天数差
DateTime d1; DateTime d2; //自己去赋值吧 int days = (d1 - d2).Days;//天数差 label1.Text = "2012-1-1 15:3 ...
- selenium无法定位元素问题
在用自动化测试工具selenium完成下载任务时,经常会遇到定位不到元素的情况,总结如下: 1.frame/iframe原因定位不到元素: 这个是最常见的原因,首先要理解下frame的实质,frame ...
- 学习推荐《从Excel到Python数据分析进阶指南》高清中文版PDF
Excel是数据分析中最常用的工具,本书通过Python与Excel的功能对比介绍如何使用Python通过函数式编程完成Excel中的数据处理及分析工作.在Python中pandas库用于数据处理,我 ...