InstallShield脚本中如何判断当前状态是安装还是卸载

2025-04-18 04:49:54
推荐回答(1个)
回答1:

开始学着用InstallShield来做安装程序了,其实我觉得SetupFactory功能也是很强大的,但是因为工作的需要,只能操练起来。
  用熟SetupFactory后,发觉再学InstanllShield其实也很简单了,原理都差不多,只是脚本写起来不太一样。
  但是我要做的安装程序比较麻烦,倒不是说功能有多复杂,而是因为这个安装程序要做3个版本,各版本之间只是软件Logo图标不同,而在InstallShield工程中,添加的快捷方式图标竟然不会随着安装包内软件图标或Logo文件的改变而改变。也就是说,虽然我在InstallShield工程中添加了软件的快捷方式,但是如果我把安装包的软件换成另外一个版本的(图标不同),做出来的安装程序在安装完以后,开始菜单及桌面上的快捷方式还是第一个版本的图标;即便是我将工程中快捷方式的Logo指定为一个Logo文件,并且将Logo文件替换掉,也还是如此。只有在更换了安装包内的文件后,重新将该文件加入到工程中,做出来的安装程序在安装完以后,快捷方式的图标才正确。但是这个过程比较麻烦,工程中重新加入文件就得将原来的删除,快捷方式也得重新加,要改好几个地方。如果软件版本不断更新,就有可能会因疏忽而做错。
  后来我想到用脚本来添加快捷方式,但发现卸载时居然会再执行一次,而我写在OnUninstall过程中的删除快捷方式代码根本就不去执行。这样就导致安装了再卸载后,桌面上多了两个快捷方式出来。于是我又想通过判断当前是安装还是卸载状态来控制快捷方式的添加或删除,但好像又没有这样的函数。
  后来我在调试时无意中显示了UNINSTALL_STRING变量的值,发现在卸载时该变量值为空,故可以通过判断该变量值是否为空来解决当前状态时安装还是卸载的问题。
  但接下来我的问题还是没有解决,因为删除快捷方式的DeleteFolderIcon函数根本就不起作用。到底是我的脚本写得不对还是别的原因?不得而知。反正今天忙了一整天,还是没搞定。
  下面就是我的脚本,不知道是哪里出了问题,也许未来某一天才能有答案。我用的版本为10.5的Premier Edition,工程为MSI Project。

function OnMoved()

STRING unInstallSting;
STRING szParam, szCommandLine, szWorkingDir, szIconPath, szShortCutKey;
STRING szItemName, szProgramFolder;
NUMBER nIcon;

begin

unInstallSting = UNINSTALL_STRING;

if (unInstallSting = "") then

// 卸载时删除快捷方式

szItemName = "管理系统";
// 在桌面上删除快捷方式
szProgramFolder = FOLDER_DESKTOP;
DeleteFolderIcon (szProgramFolder, szItemName);
// 在开始菜单上删除快捷方式
szProgramFolder = FOLDER_PROGRAMS ^ szItemName;
DeleteFolderIcon (szProgramFolder, szItemName);

else

// 安装时添加快捷方式

szParam = TARGETDIR ^ "\\MyApp.exe";
LongPathToQuote (szParam, TRUE);
szCommandLine = szParam;

szWorkingDir = TARGETDIR ;
szIconPath = TARGETDIR ^ "\\icon.ico";
nIcon = 0;
szShortCutKey = "";
szItemName = "管理系统";

// 在桌面上添加快捷方式
szProgramFolder = FOLDER_DESKTOP;
AddFolderIcon (szProgramFolder, szItemName, szCommandLine, szWorkingDir, szIconPath, nIcon, szShortCutKey, REPLACE);

// 在开始菜单上添加快捷方式
szProgramFolder = FOLDER_PROGRAMS ^ szItemName;
AddFolderIcon (szProgramFolder, szItemName, szCommandLine, szWorkingDir, szIconPath, nIcon, szShortCutKey, REPLACE);

endif;
end;