2|我的照片书 |
一. 说明
阅读对象:本人,IS的初学者。
适用版本:Installshield 12。
目的: 为了让初学IS的朋友少走些弯路,虽然不是很好的宝典,但里面很多细节都是制作安装包常碰到的经典问题。另外,也为了给自己留一些资料,方便以后查询,人的记忆力有限嘛。
内容: 制作一个简单的安装包;制作定制的安装包;其它细节注意;
二. Installshield 介绍。
1. 公司介绍。
InstallShield 软件公司是美国的一家专业从事安装软件开发工具生产的著名软件公司。该公司由Viresh Bhatia和Rick Harold于1987年创建。自Windows软件开发之初,InstallShield软件公司就已经专注于通用安装软件制作工具的开发并解决Windows操作系统发展和变革所带来的挑战,以满足开发人员及最终用户的需要。其主打产品InstallShield为满足各种平台和不同的安装需求提供完整的软件安装解决方案,并且已经形成人们所熟悉的一套软件安装的工业标准。
2. 产品介绍。
在微软Windows 2000操作系统引入Windows Installer(WI)服务之前,InstallShield公司以其拥有的标准的标准和技术在同类公司中遥遥领先。但由于WI的出现后,WI使得用户可以利用微软提供的API函数构建符合微软标准的安装软件,并充分享用微软WI服务的诸多好处。为了跟上安装软件技术的自然进化,满足用户的需求和接受新挑战,1999年9月,InstallShield 公司开始宣布InstallShield2000 专业版(简称ISPro2K)面世,这是该公司首次将软件安装开发工具划分采用自身传统标准的InstallShield Professional 和采用 微软标准Windows Installer标准的InstallShield for Windows Installer两个不同版本。
三. 制作简单的安装软件。
声明:下面的教程,是把读者当做完全没接触过IS的角度来制作的。
1. 启动InstallShield 12。建立一个InstallShield MSI Project,如图:
你会发现下边有8个选项。接下来就一项一项开始设置。
输入公司名称,应用程序的名称(注意:这个不是打包完后安装包的名称,默认的安装包名称为Setup.exe,不过可以自己定义,稍后讲),版本号,公司网址,选择“添加/删除程序”中的图标。
4. 点击Installation Requirements.
这里可以选择自己的打包软件适合运行的操作系统和必须安装的第三方软件。选不选根据自己的需要。
5. 点击 Installation Achitecture。
这里可以定义打包文件的组织结构,默认有个DefaultFeature,将文件放在这个feature下,则都默认是必须安装的。有印象的朋友会记得,在安装某些软件的时候,会有,“typical(典型)”“custom(自定义)”界面提示,选择典型安装,就是所有文件都安装,选择自定义安装,就可以去掉一些不需要安装的文件,但其它文件就是必须安装的。这个还是需要自己反复折腾一下才能明白。至于怎么加文件到feature下面,稍后讲述。
6. 点击 Application Files。
这里讲述如何添加文件。上面图片的红色区域中的文件就是我加进去的,加到了安装目录下了(注意:有个INSTALLDIR)。在这里,你就可以把你要打包的所有文件加进来。加入你安装目录下有文件夹,则先在左边右击GAGA,添加文件夹,再往里面添加文件。注意:添加完文件后,全选文件,右击,选中“Always Overwrite”。否则有时会出现重新安装后,有些文件没有被覆盖。
7. 点击 Application shortcut。
为自己的安装程序生成快捷方式,可以创建 开始菜单和桌面的快捷方式,细心发现的话,你会看见左边有个“Create an uninstallation shortcut”的选项,那个就是用来创建一个卸载方式的,不过很遗憾,这个快捷方式卸载后有时会有些文件删除不干净,不能做到完美卸载。关于怎么创建卸载快捷方式,做到完美卸载,在后面会讲。
8. 点击 Application Registry。
点完后就直接跳过吧,简单的安装工程,基本不用到这个。要了解如何操作注册表,在后面会说。
9. 点击 Installation Localization。
这里我们选上“Chinese”,默认是选上英文。如果要设置中文为默认语言的话,需要点击Installation Designer->Installation Information->General Information->String table,右击Chinese,选择 “Make default”。如图:
返回Project Assistant.这下还可以把英文去掉,因为之前英文被设为默认,所以不能直接在这里去掉,非得这么折腾一番。
10. 点击 Build Installation。
这里可以选择Single 或者 CD-ROM,区别在于第一种只生成一个.exe文件,而后者会生成好多文件,包括.msi文件等。第一种生成格式适合于制作升级程序,一般的升级程序都只要一个.exe文件就好了。点击“Build Installations”就可以生成安装包了,生成的安装包,点击"Open release folder”就可以找到了。
四. 制作定制的安装软件。
声明:该部分主要是根据自己本身在项目当中打包安装软件的时候碰到的一些问题,稍微整理一下作为这部分主要讲解的内容,由于项目功能的局限还有本人能力的有限,只能讲解自己解决的一些经典问题,并不能全面覆盖到强大的IS的各个方面,仅供读者参考。
这部分的内容貌似比较吸引人哦,“定制”两字给人比较实用,有趣的感觉。
这部分内容我们和上面制作简单的安装软件走不一样的道路,这部分内容需要新手对IS有一定的折腾后再来看,就比较适合啦。废话不再讲,开始讲解吧。
点击 Installation Designer ,如图:
1. 点击 Installation Information
管理员权限安装设置:
点击 General Information ,选择 Summary Information Stream, 选择 Require Administrative Priviledge, 将该项选择 “Yes”。这样设置之后,用户就可以有管理员的权限去安装该安装文件了,避免用户在安装的时候出现权限不够的问题。如图:
更改“添加/删除程序”面板中软件的图标。
General Information -> Add or Remove Programs -> Display Icon
设置”添加/删除程序”面板中软件可卸载。
General Information -> Add or Remove Programs -> Disable Change Button, Disable Remove Button, Disable Repair Button,这三个至少要有一个选为“NO”,全部设为“YES”的话,则在这个面板中,对应的软件没有“更改/删除”的按钮可以点击,即在这里就卸载不了软件了。那就得自己去注册表里胡搞乱改,把它搞掉了。
设置“软件名称”,“版本号”还有“安装路径”。
General Information -> Product Properties->NAME ,VERSION,INSTALLDIR
关于“Product Co
这两个关乎到版本升级问题,理论上,XP是不允许用户安装两个相同Product Code的同一个软件的,即时,每一个版本的安装包,都必须有新的Product Co de。但其实,很多时候,我们在项目的时候,并不是每一次release都是一个新版本,因为有可能只是更改了一点点,不足以作为一个新版本,这是我们可以称为是一个小版本,比如,V1.0.0-》V1.0.1。我查了一下帮助文档,找到了”Chaning the Product Co de”这篇文章,里面开头有这么一句:An update that meets the following guidelines generally does not require a change of the product co de and can be handled as a small update, or if the version is to change, as a minor upgrade。(详细请按F1,官方文档才是王道)
这句话的意思是,当update属于 small update 或者 minor upgrade的时候,就不用更改product code,这两者的区别在于,minor upgrade更改了 product version。除了这两个之外,剩下的一个就是major upgrade,生成这种安装包的时候,就需要更改product co de 和 producr version。(还是不明白的请看官方帮助文档)
另外,还有个叫做 package code的东西,当你每次release一个新的安装包的时候,无论是上面哪一个,这个package co de都会改变,这是IS给安装包自动重新生成的。不用用户区设置。这是作为每个release包的唯一区别。
总的来说:当你生成一个大版本,如V1.0.0->V2.0.0,这是就需要换Product Code了(方法:General Information -> Product Properties->Product Co de, 选中它, 左下方有个Generate GUID的按钮,点击它就可以重新生成,记得与Media->Release->PROJECT_ASSISTANT中的Product Co de保持一致,否则在卸载的时候会出现问题),否则就不用更改。
当小版本实现覆盖安装的时候,记得还要在Media->Upgrades->Update Windows Installer Setup中,common下选中prompt,这样,当你覆盖安装的时候,系统就会提示你是否要覆盖安装,否则则会提示你,已经安装了 某个Product Code 的产品,不让覆盖安装。
去掉安装界面还有卸载界面上面的”InstallShield Wizard”等字眼。
General Information -> String Tables
选中你采用的那个语言。在“Value”列中,将”InstallShield Wizard”这些字眼全部替换掉空格或者其它信息,自己决定。(注意:安装还有卸载的时候,进入的第一个界面还有最后退出的界面的”InstallShield Wizard”是去不掉的,因为去掉这些字眼本来就违反了IS的协议,你用别人的东西,肯定要标记一下别人公司的标志)
2. 点击 Organization
设置Feature(组件)的安装类型
在制作简单的安装软件的过程中,已经提到过类型安装:Minimal,Custom,Typical .
选择 Setup Types, 你会发现无论点击这三个中的任何一个,DefaultFeature都是必选的。
3. 点击 Application Da
如何添加我要打包的文件到工程中
选择Files and Folders,点击右边的***[INSTALLDIR]这个文件夹,然后在“Source compuoter’s floders”选中你要加入的文件夹,右边的“Source computer’s files”框栏中就显示这些文件,把这些直接拉到“Destination computer’s files”中。(注意:如果发现拉入的文件不对,想要删除,则不能在这里删除,而要到Organization->Components下把文件删除,这样才能删的彻底,否则会出错。另外,加入好文件后,全选这些文件,右击打开属性,选择”Always Overwrite”,这样可以强制覆盖安装。)
4. 点击 System Configuration
如何建立桌面和开始程序的快捷方式
像上面图片一样,建完快捷方式后,记得把每个快捷方式的”Working Directory”设置为”[INSTALLDIR]”.否则会出错。
5. 点击 Beha
怎么定制安装和卸载过程出现的界面
点击Install Script, IS 的installscript在安装的时候首先调用的是OnFirstUIBefore 函数,卸载的时候首先调用的是 On MaintUIBefore 函数,这两个函数都在 Before Move Da ta. 而在安装结束时调用的函数是 On FirstUIAfter 函数,而卸载结束的时候调用的是 On MaintUIAfter.
如何在卸载的时候不弹出“修改”“修复”“删除”的界面,直接进入删除
在OnMaintUIBefore函数中,从Dlg_Start到Dlg_SdFeatureTree之间的代码全部注释,然后加上nType = REMOVEALL;
如何除去安装和卸载过程中标题中的“InstallShield Wizard”字眼
安装和卸载过程中,第一个出现的界面和最后退出的界面标题的字眼是无法去除的,或者说我不知道怎么去吧,哈…其它界面上的标题可以通过:在OnFirstUIBefore中添加:SetTitle(“安装”+IFX_PRODUCT_NAME,0,BACKGROUNDCAPTION); 卸载也是一个道理,添加以上语句的函数是:On MaintUIBefore
怎么用脚本创建一个卸载快捷方式,如何“完美卸载”
IS自带的建立卸载快捷方式(Project A Assistant -> Application Shortcuts -> Create an uninstallation shortcut)是有问题的,会出现卸载不完全的现象。解决方法是写脚本:
Install Script -> After More Data -> On FirstUIAfter 中添加:
STRING szFile;
NUMBER nResult;szFile = UNINSTALL_STRING + “/UNINSTALL”;
nResult = StrFind(szFile,”.exe”);if(nResult >= 0) then
StrSub(szMsg1, szFile, 0, nResult + 4);
StrSub(szMsg2, szFile, nResult + 4, 200);LongPathToQuote(szMsg1, FALSE);
LongPathToQuote(szMsg2, FALSE);szFile = “\” + szMsg1 + “\” + szMsg2;
endif;
AddFolderIcon(FOLDER_PROGRAMS ^ “AliProbe”, “Uninstall AliProbe”, szFile, WINDIR, WINDIR ^ “System32\\msiexec.exe”, 0, REPLACE);
然后在OnMaintUIAfter()中添加: // 删除开始所有程序中的AliProbe文件夹
DeleteProgramFolder(“AliProbe”);
// 删除桌面上的快捷方式
STRING szItemName = “AliProbe”;
STRING szProgramFolder = FOLDER_DESKTOP;
DeleteFolderIcon(szProgramFolder, szItemName);
// 删除安装目录文件夹
DeleteProgramFolder(TARGETDIR);
? 向注册表写入安装路径prototype AliprobeReg(); //声明函数
function AliprobeReg()
number nRootKey,nType,nSize;
string szKey,szNumName,szNumValue,szClass;
begin
//修改注册表
nRootKey = HKEY_LOCAL_MACHINE;
RegDBSetDefaultRoot (nRootKey); //置根为nRootKey
//注册子项
szKey="SOFTWARE\\Aliprobe\\";
if RegDBKeyExist(szKey) < 0 then //不存在“SOFTWARE\\Aliprobe”,创建这个项
RegDBCreateKeyEx(szKey,"");
endif;
//初始化每个键的公共值
nType=REGDB_STRING;
nSize=-1;
//注册安装路径
szNumName="PATH";
szNumValue=TARGETDIR;
RegDBSetKeyValueEx(szKey,szNumName,nType,szNumValue,nSize);
end;在On
InstallFilesActionAfter()中调用上面的函数。
安装结束后启动进程和readme文件
在OnFirstUIAfter()中添加:
szMsg1 = "AliProbe已经安装完成";
szMsg2 = "";
bOpt1 = TRUE;
bOpt2 = TRUE;
szOption1 = "打开readme文件";
// szOption2 = "启动Aliprobe";
szOption2 = "";
nResult = SdFinish(szTitle, szMsg1, szMsg2, szOption1, szOption2, bOpt1, bOpt2);
if(bOpt1) then
if(FindFile(TARGETDIR, "readme.txt", szFile) = 0) then
LaunchApp(WINDIR^"Notepad.exe", TARGETDIR^"readme.txt");
endif;
endif;
if(bOpt2) then
if(FindFile(TARGETDIR, "AliProbe.exe", szFile) = 0) then
LaunchApp(TARGETDIR^"AliProbe.exe", "");
endif;
endif;
6. 点击 Media
对于小版本,提示覆盖安装
当小版本更新的时候,由于Product Code没有更改,所以,必须设置让它提示升级安装。选择Upgrades -> Upgrade Window Installer Setup ,选择Common ,勾上 prompt
如何更改安装包的名字,不要默认的Setup.exe
Release -> PROJECT_ASSISTANT
修改Setup file name就可以了。另外,Product Name 和 Product Version 也要做相应的修改,Product Code 和 Upgrade Co de 要保持和 General Information -> Product Properties的Product Co de 和 Upgrade Co de 要保持一致,否则会出现卸载失败。
五.其它细节注意。
1. Cannot rename directory 或 Error Co
关闭工程release的目标文件夹,即**/**/../Disk,这个文件夹,此时很有可能因为它开着而导致错误。