Installshield脚本中安装时RegDBCreateKeyEx的注意事项

2 篇文章 0 订阅
2 篇文章 0 订阅

1. 现象:

软件A和软件B在注册表同一个节点下有各自的子节点,比如在

HKEY_LOCAL_MACHINE\Software\MyCompany\COMMON下有SoftwareA和SoftwareB两个子项,各自又分别有自己的键值。

在卸载时发现先安装的软件被卸载后,COMMON这一层的节点也会被删除,导致另一个软件的注册项也被删除。

2.原因

安装脚本中用如下代码添加注册表项:

RegDBSetDefaultRoot ( HKEY_LOCAL_MACHINE );
RegDBCreateKeyEx ("Software\\MyCompany\\COMMON\\SoftwareA" ,"");
RegDBSetKeyValueEx ("Software\\MyCompany\\COMMON\\SoftwareA", "Value1" , REGDB_STRING , "xxx" , -1);
RegDBSetKeyValueEx ("Software\\MyCompany\\COMMON\\SoftwareA", "Value2" , REGDB_STRING , "xxx" , -1);

上述第二句在创建节点时,如果发现上一层不存在,则会逐层依次添加,而添加的节点都会被InstallShield记录下来,以便在卸载时删除这些节点。第一个软件安装时创建了COMMON节点,其他软件安装时无需再创建,卸载时也就不会删除,而第一个安装的软件在卸载时会删除COMMON节点,导致COMMON节点下的子节点被一并删除。

3. 解决方法

在RegDBCreateKeyEx("Software\\MyCompany\\COMMON\\SoftwareA" ,"");语句前加入如下代码:

if(RegDBKeyExist("Software\\MyCompany\\COMMON") < 0) then
   Disable(LOGGING);
   RegDBCreateKeyEx ("Software\\MyCompany\\COMMON" ,"");
   Enable(LOGGING);
endif;

Disable(LOGGING);表示禁用InstallShield的记录功能,此后的操作不会被记录,因此在卸载时也不会恢复。Enable则重新恢复记录功能。

上述代码的一个隐患是COMMON节点永远不会被删除,不过可以在卸载脚本中添加代码进行判断,当COMMON下没有子节点时将其删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值