Прервите установку Install Shield, если в реестре существует определенный ключ.

Во время установки setup.exe, если в реестре существует определенный ключ, я хочу прервать установку. Для этого я вызываю функцию сценария установки, используя настраиваемое действие в проекте установки щита. Код скрипта установки:

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


person Ankush Butole    schedule 10.11.2017    source источник
comment
Я понимаю, что кто-то уже предоставил ответ, но функциональность, которую вы пытаетесь реализовать, может быть реализована изначально с использованием таблиц RegLocator и LaunchCondition. RegLocator может заполнить свойство, если ключ существует. LaunchCondition может привести к сбою установки, если это свойство существует.   -  person Doc    schedule 11.11.2017


Ответы (1)


Это не подтверждено на 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 для обозначения перенаправленного местоположения.
  • Измените свой код, чтобы запросить 64-разрядное представление реестра, локально изменив REGDB_OPTIONS, чтобы включить REGDB_OPTION_WOW64_64KEY. Пока указан этот флаг, функции реестра InstallScript не будут перенаправлены. Не забудьте вернуть REGDB_OPTIONS его предыдущее значение.
  • Если ваш проект основан на MSI, рассмотрите возможность использования системного поиска и вместо этого введите 19 настраиваемых действий «ошибка».

Обратите внимание, что если этот ключ создан программным обеспечением, находящимся вне вашего контроля, вам необходимо убедиться, что вы проверяете правильное местоположение. Это повлияет на то, будет ли первая или вторая пуля лучшим выбором для вашей ситуации. (Если ключ полностью находится под вашим контролем, вы также должны подумать о том, использует ли он правильное местоположение, и изменить его, если это не так.)

person Michael Urman    schedule 10.11.2017
comment
Спасибо, Майкл.. Вы абсолютно правы... С помощью REGDB_OPTIONS все заработало.. Многие вещи прояснились благодаря такому хорошему объяснению???? - person Ankush Butole; 14.11.2017