Windows installer 如果注册表中存在特定的注册表项,则中止Install Shield安装

Windows installer 如果注册表中存在特定的注册表项,则中止Install Shield安装,windows-installer,installshield,installscript,installscript-msi,Windows Installer,Installshield,Installscript,Installscript Msi,在setup.exe安装过程中,如果注册表中存在特定项,我希望中止安装。为此,我在install shield project中使用自定义操作调用安装脚本函数。 安装脚本代码为: function MyFunction(hMSI) // To Do: Declare local variables. STRING szKey; NUMBER nRootKey; begin // Set the root key to HKEY_LOCAL_MACHINE. n

在setup.exe安装过程中,如果注册表中存在特定项,我希望中止安装。为此,我在install shield project中使用自定义操作调用安装脚本函数。 安装脚本代码为:

function MyFunction(hMSI)
    // To Do:  Declare local variables.
    STRING szKey;
    NUMBER nRootKey;

begin
// Set the root key to HKEY_LOCAL_MACHINE.
    nRootKey = HKEY_LOCAL_MACHINE;

    if (RegDBSetDefaultRoot (nRootKey) < 0) then
        MessageBox ("First call to RegDBSetDefaultRoot failed.", SEVERE);
    else
        MessageBox ("Root key successfully set to HKEY_LOCAL_MACHINE.",
                   INFORMATION);
    endif;

szKey = "SOFTWARE\\Test";

if (RegDBKeyExist (szKey)< 0) then
MessageBox ("Test is not present", SEVERE);
abort;
endif;

if (RegDBKeyExist (szKey)= 1) then
MessageBox ("Test is present", SEVERE);
abort;
endif;

    // To Do:  Write script that will be executed when MyFunction is called.

end;
函数MyFunction(hMSI)
//要做的事情:声明局部变量。
字符串szKey;
编号nRootKey;
开始
//将根密钥设置为HKEY_LOCAL_机器。
nRootKey=HKEY_本地_机器;
如果(RegDBSetDefaultRoot(nRootKey)<0),则
MessageBox(“首次调用RegDBSetDefaultRoot失败”,严重);
其他的
MessageBox(“根密钥已成功设置为HKEY_LOCAL_机器。”,
信息);
endif;
szKey=“软件\\测试”;
如果(RegDBKeyExist(szKey)<0),则
消息框(“测试不存在”,严重);
中止
endif;
如果(regdbkeyest(szKey)=1),则
消息框(“测试存在”,严重);
中止
endif;
//待办事项:编写调用MyFunction时将执行的脚本。
结束;
每次我收到消息“测试不存在”,即使注册表中存在“HKEY\U LOCAL\U MACHINE\SOFTWARE\Test”项

我想我做错了剧本或者遗漏了什么。 请帮忙

参考链接:


你的问题没有100%得到证实,但我很有可能:

  • 您正在64位Windows安装上进行测试
  • 您正在使用C:\Windows\System32\Regedt32.exe或等效程序创建并直观验证注册表项,以及
  • 您不知道InstallScript引擎作为32位进程运行,或者不知道其含义
  • 如果这都是真的,那么问题是您已经创建了密钥HKEY\U LOCAL\U MACHINE\SOFTWARE\Test,但是您的代码正在检查HKEY\U LOCAL\U MACHINE\SOFTWARE\WOW6432Node\Test,原因是。要解决此问题,应执行以下操作之一:

    • 在32位视图中测试密钥(例如,启动C:\Windows\SysWow64\regedt32.exe);这将允许您使用名称HKEY_LOCAL_MACHINE\SOFTWARE\Test来表示重定向的位置
    • 更改代码以请求注册表的64位视图,方法是在本地更改为包含REGDB\u OPTION\u WOW64\u 64KEY。指定该标志后,不会重定向InstallScript注册表函数。不要忘记将REGDB_选项设置回其先前的值
    • 如果您的项目是基于MSI的,请考虑使用系统搜索并键入19“错误”自定义动作而不是

    请注意,如果此密钥是由您无法控制的软件创建的,则需要确保您正在检查正确的位置。这将影响第一颗子弹还是第二颗子弹更适合你的情况。(如果密钥完全在您的控制之下,您还应该考虑它是否使用了正确的位置,如果没有,则进行更改。)

    我知道有人已经提供了答案,但您尝试实现的功能可以使用RegLocator和LaunchCondition表以本机方式完成。如果键存在,RegLocator可以填充属性。如果该属性存在,LaunchCondition可能会导致安装失败。谢谢Michael..你完全正确…通过使用REGDB_选项,事情得到了解决..由于这样好的解释,很多事情都被清除了