2010-05-29 1 views
6

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

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

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

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

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

+0

У вас есть 'Win64 =" no "' на вашем '' теге? Если нет, попробуйте установить его. –

+1

даже не позволяет мне скомпилировать, если я установил это ... Я действительно надеялся, что это было легко. Ошибка, которую я получаю: Ошибка LGHT0204: ICE80: Этот 32BitComponent InstallDirectoryRegister использует 64BitDirectory INSTALLDIR –

+0

Если вы изменили компонент на 32 бит, вы также должны изменить каталог установки на 32 бит. Вот что означает сообщение об ошибке. –

ответ

2

Тот факт, что Перенаправление реестра не удается в ОС Windows Vista,   x64 очень странно, потому что в соответствии с MSDN, Registry Redirector, Windows Vista,   должны также быть затронуты ею.

Комментарий в другом ответе: «Это не сработает, когда я создаю версию приложения x64, устанавливаемую в x64 PFiles, она говорит мне, что я использую 64-разрядный каталог установки и не ' t разрешить 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

Возможно, вам необходимо изменить код вашего 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 Installer на 64-битных операционных системах с условиями в таблице компонентов, используя свойство VersionNT64 (или Msix64 или Intel64 при необходимости).

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

+0

У bootstrapper нет проблем, он ищет правильный улей реестра. его msi, который записывает значение в неправильный улей. на win7 64bit, 32-битный msi, некоторые, как пишет на 64-битный куст, а не ожидаемый WOW6432Node, как он должен. –

+0

Я имел ввиду Vista 64bit в моем комментарии, а не win7, но так или иначе. Я знаю, что могу сделать это вручную, заставив WOW6432Node, но мне не нужно было его принуждать, так как он должен писать там какой-нибудь способ, так как установщик 32-битный.почему мне не нужно заставлять WOW6432Node на Win7? –

+0

Извините, я не понимаю вашего комментария. Вы можете просто определить два компонента один с разделом реестра 'Software \ WOW6432Node \ DroidExplorer \ InstallPath', а другой с ключом реестра' Software \ DroidExplorer \ InstallPath'. Для первого компонента вы должны использовать условие 'VersionNT64', а для второго - условие' NOT VersionNT64'. В вашей настройке всегда будет 32-битная версия ключа 'Software \ DroidExplorer \ InstallPath'. – Oleg

-1

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

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

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

Это не сработает, когда я создаю версию x64 приложения, которая устанавливается в x64 PFiles, она говорит мне, что я использую 64-разрядный каталог установки и не разрешает Win64 = no –

+0

Конечно, если у вас есть компонент x64, тогда весь msi - это x64 и не позволит компонентам win32. Невозможно (без обмана) иметь как компоненты win32, так и x64 в одном msi. См. Здесь подробности: http://blogs.msdn.com/b/heaths/archive/2008/01/15/different-packages-are-required-for-different-processor-architectures.aspx – Stefan

+0

Это сообщение говорит он должен разрешить запись на 64 и 32-разрядные ульи, но это проблема, с которой я столкнулся, она не пишет 32-битный куст, если он установлен на 64 бита. Я даже поставляю WOW6432Node в пути реестра. –

0

Единственный способ сделать это с помощью пользовательского действия.

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

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

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

+0

Я не хочу форматировать 64-битный реестр, я хочу использовать 32-битный реестр, независимо от того, какая версия ОС. Я говорю, что путь находится в WOW6432Node, но он все еще записывает путь «не-WOW6432Node». –

+0

Вы ошибаетесь в том, как работает WoW6432Node, вы не можете указать его в пути к вашему разделу реестра. Если вы выполняете 32-разрядный процесс на 64-битной машине, реестр автоматически использует этот путь. Если вы пишете 64-битный процесс на 64-битной машине, он использует стандартный ключ. Если вам нужно записать в 32-разрядную секцию из 64-битного установщика, поместите ключ реестра в свой собственный компонент и укажите Win64 = «no», СДЕЛАТЬ УВЕРЕННО. WoW6432Node НЕ на вашем пути. Если это не сработает, возможно, вам придется скомпилировать все для 32 бит. – jonathanpeppers

Смежные вопросы