WiX не добавит настройки реестра HKLM во время установки Windows 7
Я написал установщик WiX, который отлично работает с Windows XP, но при установке в Windows 7 я столкнулся с трудностями с регистрационными записями. Мне нужно добавить запись HKLM, а также запись в реестре для программы, отображаемую в меню "Пуск". Вот код, который я использую для обоих типов записей:
<!-- Create the registry entries for the program -->
<DirectoryRef Id="TARGETDIR">
<Component Id="RegistryEntriesInst" Guid="...">
<RegistryKey Root="HKLM"
Key="Software\$(var.Manufacturer)\$(var.ProductName)"
Action="createAndRemoveOnUninstall">
<RegistryValue
Type="string"
Name="installed"
Value="true"
KeyPath="yes"/>
</RegistryKey>
</Component>
<Component Id="RegistryEntriesVer" Guid="...">
<RegistryKey Root="HKLM"
Key="Software\$(var.Manufacturer)\$(var.ProductName)"
Action="createAndRemoveOnUninstall">
<RegistryValue
Type="string"
Name="version"
Value="$(var.ProductVersion)"
KeyPath="yes"/>
</RegistryKey>
</Component>
</DirectoryRef>
<!-- To add shortcuts to the start menu to run and uninstall the program -->
<DirectoryRef Id="ApplicationProgramsFolder">
<Component Id="ApplicationShortcut" Guid="...">
<Shortcut Id="ApplicationStartMenuShortcut"
Name="$(var.ProductName)"
Description="..."
Target="[SERVERLOCATION]$(var.Project.TargetFileName)"
WorkingDirectory="SERVERLOCATION"/>
<Shortcut Id="UninstallProduct"
Name="Uninstall $(var.ProductName)"
Description="..."
Target="[System64Folder]msiexec.exe"
Arguments="/x [ProductCode]"/>
<RemoveFolder Id="SERVERLOCATION" On="uninstall"/>
<RegistryValue
Root="HKCU"
Key="Software\$(var.Manufacturer)\$(var.ProductName)"
Name="installed"
Type="integer"
Value="1"
KeyPath="yes"/>
</Component>
</DirectoryRef>
Как я могу исправить эту проблему?
С другой стороны, права на реестр одинаковы на компьютерах с Windows XP и Windows 7.
Ответы
Ответ 1
Я выяснил, почему это происходит.
С установкой WiX, скомпилированной на платформе x86, Windows 7 выбрала его как 32-разрядный установщик с 32-разрядными ключами реестра. Windows 7 64-разрядные обрабатывают 32-разрядные записи реестра, делая то, что я видел.
Программа все еще была зарегистрирована; это было просто не в 64-битной части реестра. Скомпилируйте его под платформой x64, внося необходимые изменения, чтобы сделать его для 64-битной системы (ProgramFileFolder станет ProgramFiles64Folder и т.д.), И это поместит вещи в нужное место.
Ответ 2
Спасибо, что в основном решили это для меня!
Я просто хотел добавить, что вам необязательно менять все на x64, чтобы это работало, только соответствующий компонент должен быть помечен как x64.
<Component Id="MyShellExtension64.dll" Guid="..." Win64="yes">
<Condition>VersionNT64</Condition>
<File
Name="MyShellExtension64.dll"
Source="MyShellExtension64.dll"
KeyPath="yes"/>
<RegistryValue
Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved"
Name="{GUID}" Value="My Shell Extension" Type="string"/>
</Component>
Обратите внимание на Win64 = "yes" , это все, что требуется для записи в 64-разрядную область реестра. Условие VersionNT64 существует, поэтому этот компонент будет установлен только в системе x64.
В моем случае это дает предупреждения ICE80, потому что я хочу установить 64-битный компонент в 32-разрядный ProgramFilesFolder. Я с удовольствием проигнорирую их, потому что, поскольку мое основное приложение не x64, только расширение оболочки, и я не хочу помещать расширение оболочки в свою собственную специальную папку.
Ответ 3
Существуют некоторые отличия от того, как Windows 7 обрабатывает определенные ключи реестра. Отражение реестра было удалено, начиная с Windows 7. Я не уверен, что это играет в то, что вы видите здесь, но посмотрите эту ссылку, чтобы узнать больше об этом.
Кроме того, если вы работаете с 64-разрядной версией Windows 7, вы можете вникнуть в некоторые особенности, обратившись к MSDN 64-разрядное руководство по программированию Windows.
Кроме того, если вам нужно иметь разные ключи реестра, установленные в разных местах в зависимости от вкуса Windows (XP, Vista, 7 и т.д.), тогда этот вопрос стека переполнения также имеет ответ для вас.