Функция RegDBKeyExists не может прочитать в Installshield - PullRequest
0 голосов
/ 10 февраля 2011

Мы разработали пакет MSI в Installshiled 2008 Premier Edition, и тип проекта - Installscript MSI, недавно мы купили 2011 год и обновили наш проект до 2011 года.

В более ранней версии мы использовали для проверки записей реестра для Microsoft SQL Express и его путь

**HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL**

Теперь появилось новое требование для создания пакета для 64-битной O.S., поскольку O.S. 64-битный, но путь реестра для SQL Express в 64-битной версии

**HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server\Instance Names\SQL**

Функция реестра RegDBKeyExists предназначена для проверки наличия реестра SQL, но функция возвращает отрицательное число в виде -2147483646 и не может прочитать.

установка опции REGDB_OPTIONS = REGDB_OPTIONS | REGDB_OPTION_WOW64_64KEY не поможет, поскольку мы не читаем 64-битный реестр Hive.

Ответы [ 2 ]

1 голос
/ 10 февраля 2011

Не беспокойся об этом; Реестр Рефлекса делает это правильно без лишнего кода. Когда 32-разрядное приложение обращается к HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL на 64-разрядной машине, оно будет перенаправлено и увидит HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server\Instance Names\SQL (если только оно не проходит KEY_WOW64_64KEY - эквивалент REGDB_OPTION_WOW64_64KEY).

Если вы жестко закодируете ключ Wow6432Node в своем запросе, этот сценарий будет стремиться увидеть ключи в пути, включая HKLM\Software\Wow6432Node\Wow6432Node\..., и не сможет найти ключ, который вы хотели найти.

0 голосов
/ 23 апреля 2015

В дополнение к ответу Майкла и моему комментарию (то есть вопросу) вот функция InstallScript для переключения отражения реестра:

prototype void EnableRegistryReflection( BOOL );
///////////////////////////////////////////////////////////////////////////////
//                                                                           
// Function:  EnableRegistryReflection
//                                                                           
//  Purpose:  Toogle the automatic conversion of registry keys from 64 to 32 bit equalivents.
//            This is enabled by default.
//                                                                           
///////////////////////////////////////////////////////////////////////////////
function void EnableRegistryReflection( bEnable )
begin
    if( bEnable ) then
        REGDB_OPTIONS = REGDB_OPTIONS & ~REGDB_OPTION_WOW64_64KEY;
    else
        REGDB_OPTIONS = REGDB_OPTIONS | REGDB_OPTION_WOW64_64KEY;       
    endif;
end;
...