Запись места установки в реестр из программы установки

StackOverflow https://stackoverflow.com/questions/9361234

  •  28-10-2019
  •  | 
  •  

Вопрос

Я использую WiX 3.6 чтобы создать программу установки.

Одна из потребностей - записать местоположение места установки в реестр либо в HKCU, либо в HKLM, в зависимости от свойства ALLUSERS.

Теперь, основываясь на проведенном мной исследовании, я думаю, что должно сработать следующее

<RegistryKey Root="HKMU" 
             Key="Software\OpenCover" 
             Action="createAndRemoveOnUninstall">
  <RegistryValue  Name="Location" 
                  Type="string" 
                  Value="[APPLICATIONFOLDER]" 
                  Action="write" 
                  KeyPath="yes" />
</RegistryKey>

Проблема в том, что это работает только тогда, когда ALLUSERS="", т.е.HKMU интерпретируется как HKCU.

Если я попробую установку perMachine, где ALLUSERS = 1, то запись не будет записана в HKLM, как ожидалось, хотя, когда я просматриваю файл журнала установки, я вижу вызов WriteRegistryValues .

MSI (s) (D4:14) [22:46:24:901]: Executing op: ActionStart(Name=WriteRegistryValues,Description=Writing system registry values,Template=Key: [1], Name: [2], Value: [3])
Action 22:46:24: WriteRegistryValues. Writing system registry values
MSI (s) (D4:14) [22:46:24:902]: Executing op: ProgressTotal(Total=2,Type=1,ByteEquivalent=13200)
MSI (s) (D4:14) [22:46:24:903]: Executing op: RegOpenKey(Root=-1,Key=Software\OpenCover,,BinaryType=0,,)
MSI (s) (D4:14) [22:46:24:903]: Executing op: RegAddValue(Name=ConsoleLocation,Value=C:\Program Files (x86)\OpenCover\,)
WriteRegistryValues: Key: \Software\OpenCover, Name: ConsoleLocation, Value: C:\Program Files (x86)\OpenCover\
MSI (s) (D4:14) [22:46:24:906]: Executing op: RegCreateKey()
WriteRegistryValues: Key: \Software\OpenCover, Name: , Value: 

Кто-нибудь может объяснить, как выполнить задачу, которую мне нужно выполнить

Это было полезно?

Решение

На самом деле проблема связана с 32-разрядным установщиком на 64-разрядной платформе.

Когда в этом сценарии используется ALLUSERS="1", то записи реестра, помеченные HKMU, фактически записываются, но в данном случае в HKLM\Software\Wow6432Node\OpenCover.Я подозреваю, что записи, помеченные как HKLM, также перенаправляются таким же образом.

К сожалению, документация по WriteRegistryЗначит Действие не объясняет 32/64-битное "волшебное" перенаправление, а информация, касающаяся фактической записи в реестре, не отображается в журналах.

Чтобы получить представление о том, что происходит, следующая статья демистифицирует наблюдаемое поведение Разделы реестра, на которые влияет WOW64.Из этой статьи мы видим, что установщик "думает", что он записывает данные в папку HKLM\Software, но на самом деле это происходит "перенаправленный" к HKLM\Wow6432Node\Software для 32-разрядного процесса на 64-разрядной платформе и, следовательно, объясняет, почему это не отражено в файлах журнала.В статье также объясняется, почему, когда ALLUSERS="" и HKMU равно HKCU, записи отображаются там, где их можно было бы ожидать, потому что эти записи "общий доступ" между 32- и 64-разрядными приложениями.

Другие советы

Я предполагаю, что ваш установщик не поднимает (UAC включена?) И что записи в HKLM перенаправляется на HKCU.

Кстати, вы также можете рассмотреть возможность использования API установщика Windows Installer из вашего приложения для запроса обновления, кода Product, ProductInformation (установка) без необходимости записать ключ реестра для хранения этих метаданных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top