1

在 setup.exe 安装过程中,如果注册表中存在特定键,我想中止安装。为此,我正在使用 install shield 项目中的自定义操作调用 install-script 函数。安装脚本代码是:

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;

每次我收到消息“测试不存在”时,即使注册表中存在键“HKEY_LOCAL_MACHINE\SOFTWARE\Test”。

我想我在脚本中做错了什么或遗漏了一些东西。请帮助解决这个问题。

参考链接: http ://helpnet.installshield.com/installshield19helplib/Subsystems/installshield19langref/helplibrary/LangrefRegDBKeyExist_example.htm#Langref_appendixD_3271668955_1023535

https://community.flexerasoftware.com/showthread.php?139026-Check-if-a-registry-key-exists

4

1 回答 1

2

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

  1. 您正在 64 位安装的 Windows 上进行测试,
  2. 您正在使用 C:\Windows\System32\Regedt32.exe 或等效项创建并直观地验证注册表项,并且
  3. 您不知道 InstallScript 引擎作为 32 位进程运行,或者不知道其中的含义。

如果这一切都是真的,那么问题是您已经创建了密钥 HKEY_LOCAL_MACHINE\SOFTWARE\Test,但是由于注册表重定向器,您的代码正在检查 HKEY_LOCAL_MACHINE\SOFTWARE\ WOW6432Node \Test 。要解决此问题,您应该执行以下操作之一:

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

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

于 2017-11-10T15:16:44.947 回答