使用installshield 获取注册表,删除注册表判断安装版本等
大家在做安装包的时候常常会遇到更新等问题,在使用installshield制作安装包,如果软件版本发生改变,那么更新是自动完成的。但是我们这里有一个问题,在installshield如果新版本的regist信息和旧版本的regist信息发生了改变,比如说注册表结构改变,或是不需要以前的注册表目录想要删除时,那么在运行新的安装程序时候,程序必然会报错。。这样就是为啥好多软件安装新版本的时候他会要求你删除原先的版本在继续进行安装(一开始我的解决方案是将以前注册的dll通过脚本删除,但是发现虽然dll的注册信息删除了,但是其程序还在添加和删除安装程序中,所以此方法不可行)。现在给大家讲下怎么实现判断以前版本是否安装,并提示用户删除。
在installshield里面有Product Code这个选项,它的意思就是一个特定是产品编码,来确定是否是同一个软件的。下面这个是我们旧版本的截图。
新版本的Product Code如下
在更遍了Product Code后,在运行安装包的同时就不会出现升级的界面了,但是这样的话会在机器里面出现一个软件的两个版本,对用户来说这是相当不礼貌的做法啊。
所以我们想如何能判断用户是否安装了以前的版本并提示他删除,这样的话我在注册表信息里面找啊找终于被我找到了。。
在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{你的产品Code},如果用户安装了你的软件并且没有卸载就会在这里出现这条注册信息。。
这样的话我们现在的问题就是如何在安装得时候检测到这条注册表信息,并提示用户卸载这个版本。
我们的目的是在安装之前检测并提示所以要在function OnFirstUIBefore()中写入脚本。我找到一个函数
RegDBKeyExist(“\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{你的产品Code}”);
其返回值为-1代表没有找到这条注册信息,1为找到这条注册信息。
使用这个函数前需要使用这个函数来确定进行注册表操作的根目录:
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
知道这些后咱们的任务基本完成啦,附上代码:
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE); if(RegDBKeyExist("\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{5E3673E9-3F06-40B7-B852-5A52D43316D9}")>0) then MessageBox("安装软件检测到较早版本,为保证软件正确安装请卸载该版本,安装程序即将结束。",SEVERE); abort; endif;
其实代码是很简单的,主要是installshield得脚本语言大家都不熟悉,而且网上资料比较少。
删除注册的函数RegDBDeleteKey(string)
给大家我找到的一份installshield的脚本语言函数等的介绍合计,希望对大家以后的工作有所帮助哈!