Запись места установки в реестр из установщика - PullRequest
3 голосов
/ 20 февраля 2012

Я использую 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: 

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

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

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

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

К сожалению, документация по действию WriteRegistryValues ​​ не объясняет 32/64 бит «магического» перенаправления, а информация, информация о фактической записи реестра, не отображается в журналах.

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

0 голосов
/ 20 февраля 2012

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

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

...