这两天在做一个关于程序打包的bug。现在将一些使用的心得记录如下:
我希望实现的操作是:在安装一个程序之前,先检查 Installatiion Requirements(例如是否安装了Flash Media Server等)。如果已安装了FMS,则将自己的产品作为一个插件放入到FMS的软件目录下。如果没有安装,则弹出对话框告诉用户要首先安装FMS,并停止安装。
InstallShield的Project Assistant功能无法实现我的需求,所以我打算写InstallScript脚本实现。判断软件是否已安装,我是通过查询注册表来实现的。一般程序安装完成之后,都会在“HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\”下进行注册,你可以遍历该key下的所有subkey,通过字符串匹配来查看是否已经安装了FMS,然后查询该FMS key内的value name:InstallLocation的值。例如,我的地址为:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Media Server 4.5_is1下的InstallLocation值为:e:\Program Files\Adobe\Flash Media Server 4.5\。我查找到该路径之后,即可以将其作为安装目录,安装自己的软件。 这里需要说明的是:如果在64位机器上安装32位程序,OS会自动将其注册到: “SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\”之内。
安装完成之后,在进行卸载时,遇到了另外一个问题:我的脚本执行顺序设置为:Immediate Execution。这样造成了在卸载时,该脚本仍然会执行一次。我希望在脚本执行之前自主判断当前操作是在执行安装操作还是执行卸载操作,如果是卸载则不执行该脚本。查阅了一些资料,有人说,系统变量UninstallString在卸载时为"",可以根据它是否为空来判断现在的状态是安装还是卸载。但是我试了一下,并不是这样,具体原因并没有深究。继续查阅发现有另外一个系统变量"MAINTENANCE",它在安装时为假,在维护,修护,卸载时为真,我根据该系统变量值判断出,现在进行的是安装还是卸载操作。如果是卸载操作,则直接返回。
由于是刚接触InstallScript,一知半解,几十行代码让我写了好几天。郁闷~~另外有一个问题想请教大家:InstallScript脚本中貌似没有break关键字;我如何在执行while循环时跳出呢。例如:从链表subKeyList中依次取出keyName 字符串,并进行比较,如果相匹配,则结束。如何实现?
ListFind=ListGetFirstString(subKeyList,KeyName);
while(ListFind<END_OF_LIST)
{
if(strCompare(KeyName, "Adobe Flash Media Server")>=0)
break;
ListFind=ListGetNextString(subKeyList, KeyName);
}
浙公网安备 33010602011771号