Почему установщик x86 WiX в Windows Vista x64 не записывает ключи к Wow6432Node в реестре? - PullRequest
6 голосов
/ 29 мая 2010

У меня есть установщик, который пишет в HKLM\Software\DroidExplorer\InstallPath. На любом компьютере с архитектурой x86 он отлично записывает данные в ожидаемое местоположение, а в Windows XP x64 и Windows 7 x64 он также записывает данные в ожидаемое местоположение, которое на самом деле HKLM\Software\Wow6432Node\DroidExplorer\InstallPath.

Позже во время установки мой загрузчик, который также является x86, пытается прочитать значение. На всех компьютерах с Windows x86 он успешен, а на Windows XP x64 и Windows 7 x64, но Windows Vista x64 не может найти ключ. Если я смотрю в реестре, он фактически не записывает его в Wow6432Node в Windows Vista; это пишет это Software\DroidExplorer\InstallPath.

Если я принудительно не сообщаю установщику о необходимости записи в Wow6432Node, он записывает значение в Software\DroidExplorer\InstallPath, но загрузчик все еще пытается просмотреть Wow6432Node из-за отражения реестра . Это на всех системах x64.

Почему Windows Vista x64 единственная, с которой я сталкиваюсь с этой проблемой? Есть ли способ обойти это?

Я просто хочу добавить редактирование, которое все еще открыто. Ни одно из приведенных ниже предложений еще не решило эту проблему.

Ответы [ 4 ]

2 голосов
/ 11 января 2011

Сбой перенаправления реестра в Windows Vista x64 очень странный, поскольку, согласно MSDN, Перенаправитель реестра , Windows Vista также должна затронуть его.

Комментарий в другом ответе: " Это не работает, когда я собираю версию приложения для x64, которая устанавливается в P64-файлы x64, она говорит мне, что я использую 64-разрядный каталог установки, и не не позволяйте Win64 = no"оставить меня немного смущенным относительно того, какой тип MSI вы создаете.

Перенаправление реестра повлияет только на 32-разрядные компоненты в вашем MSI. Если целевой платформой для проекта WiX является x86, то получающийся MSI будет 32-разрядным MSI, и перенаправление реестра затронет все компоненты.

С другой стороны, если целевой платформой проекта WiX является x64, то перенаправление реестра будет зависеть только от тех компонентов, которые явно помечены как Win64 = no. (По умолчанию WiX предполагает, что все компоненты являются 64-битными, если ваша целевая платформа x64.)

Обратите внимание, что если компонент для вашей записи реестра включен в папку ProgramFiles64, то WiX будет считать, что это 64-разрядный компонент, и на него не повлияет перенаправление реестра. По этой причине WiX не позволяет вам указать Win64 = no для этого компонента.

Вы должны убедиться, что каждый компонент, содержащий запись реестра, которую вы хотите перенаправить, настроен на использование ProgramFiles (32-разрядного), поскольку он является родительским каталогом как в x86, так и в x64 MSI-файлах.

1 голос
/ 28 июля 2010

Вероятно, вам придется изменить код вашего 32-битного загрузчика.Вы должны проверить, работает ли приложение в 64-битной операционной системе, например, в отношении функции IsWow64Process (см. http://msdn.microsoft.com/en-us/library/ms684139.aspx). Если операционная система 64-битная, то вы должны открыть ключ с флагом KEY_QUERY_VALUE | KEY_WOW64_64KEY (или другие флаги в сочетании с KEY_WOW64_64KEY) в RegOpenKeyEx.

Если у вас возникнут проблемы с перенаправлением файлов в 64-битных операционных системах, вы можете вызвать Wow64DisableWow64FsRedirection в загрузчике (см. http://msdn.microsoft.com/en-us/library/aa365743.aspx).

ОБНОВЛЕНО на основе комментария: если вы хотите, чтобы ключ Software\WOW6432Node\DroidExplorer\InstallPath был создан MSI (например, при установке 32-разрядного приложения), вы можете сделать это напрямую.установщик Windows должен работать в 64-разрядных операционных системах с условиями в таблице компонентов, использующими свойство VersionNT64 (или Msix64 или Intel64, если необходимо).

ОБНОВЛЕНО 2 рассмотрите возможность использования флагов msidbComponentAttributesDisableRegistryReflection или / и msidbComponentAttributes64bit для компонентов с ключами реестра, которые вы создаете. Кроме того, проверьте, какие значения вы используете в свойствах Template Summary (x64;1033 или Intel;1033) и Page Count Summary (должно быть 200или жебольше) в сводном информационном потоке.

0 голосов
/ 01 декабря 2010

Единственный способ сделать это - через настраиваемое действие.

Вы должны будете вызвать RegOpenKeyEx и установить 0x100 для параметра REGSAM samDesired, чтобы принудительно использовать 64-битный реестр.См. RegOpenKeyEx здесь .

Вы не можете использовать стандартные классы реестра .NET для этого.Вам придется вручную использовать P / Invoke при использовании языка .NET.

Возможно, вам будет лучше, если вы предоставите два установщика, один для 64-разрядных и один для 32-разрядных.Вот как мы боролись с этой проблемой, поскольку она намного менее сложна.

0 голосов
/ 30 июля 2010

Необходимо установить компонент на Win32 , используя параметр Win64="No". В противном случае MSI будет использовать любую систему, на которой работает, по умолчанию (то есть x64 в такой ОС).

Так, например:

<Component Id="C__mycomponent" Guid="MYGUID" Win64="No">
  <RegistryKey Root="HKLM" Key="Software\DroidExplorer\InstallPath" Action="createAndRemoveOnUninstall" />
</Component>
...