Программа установки Wix использует путь к приложению по умолчанию при обновлении, а не из реестра, как ожидалось - PullRequest
0 голосов
/ 08 октября 2018

Мы используем Wix Toolset V3.11 для построения нашей установки.

Из-за следующего объявления наш путь установки по умолчанию - C:/Program Files(x86)/Acme/AppName.

<Property Id="ApplicationFolderName" Value="$(var.Manufacturer)\$(var.AppFolderName)"  />
<Property Id="WixAppFolder" Value="WixPerMachineFolder" />

С помощью кнопки «Дополнительно» в настройке мы изменяем этот путь на C:/Program Files(x86)/Acme/FooBar:

enter image description here

СледующееОбъявление сохраняет измененный путь в реестре:

<RegistryKey
    Key="Software\$(var.Manufacturer)\$(var.AppName)"
    Root="HKLM">
    <RegistryValue Id="InstallationRegistry"
        Type="string"
        Name="InstallDir"
        Value="[APPLICATIONFOLDER]" />
    </RegistryKey>

Через Regedit.exe я вижу путь C:/Program Files(x86)/Acme/FooBar в реестре, как и ожидалось.Все хорошо.

Проблема: Но теперь, когда я запускаю новую установку, которая является обновлением, все файлы были перемещены из пользовательской папки C:/Program Files(x86)/Acme/FooBar в папку по умолчанию C:/Program Files(x86)/Acme/AppName.

Когда я выполняю обновление и нажимаю кнопку «Дополнительно», то по умолчанию заранее выделяется путь C:/Program Files(x86)/Acme/AppName:

enter image description here

Я использую следующую разметку, чтобы запросить путь из реестра:

<Property Id="APPLICATIONFOLDER">
    <RegistrySearch Id='InstallationRegistrySearch' Type='raw' Root='HKLM' Key='Software\$(var.Manufacturer)\$(var.AppName)' Name='InstallDir' />
</Property>

Вот соответствующая разметка:

<Fragment>
    <ComponentGroup Id="RootComponents" Directory="APPLICATIONFOLDER">
      <Component Id="RootComponent" Guid="xxxxxxxxx" Win64='yes'>   
        <RegistryKey
          Key="Software\$(var.Manufacturer)\$(var.AppName)"
          Root="HKLM">
          <RegistryValue Id="InstallationRegistry"
                         Type="string"
                         Name="InstallDir"
                         Value="[APPLICATIONFOLDER]" />
        </RegistryKey>

      </Component>      
    </ComponentGroup>

    [...]


<Product ...>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="PROGRAMFILESPATH" Name="$(var.ProgramFilesPath)">
        <Directory Id="ManufacturerFolder" Name="$(var.Manufacturer)">
          <Directory Id="APPLICATIONFOLDER" Name="$(var.AppFolderName)" >

            <!-- here are the application files (e.g. Appname.exe)-->
            [...]

          </Directory>
        </Directory>
      </Directory>      
    </Directory>


    [...]

    <Property Id="ApplicationFolderName" Value="$(var.Manufacturer)\$(var.AppFolderName)"  />
    <Property Id="WixAppFolder" Value="WixPerMachineFolder" />

    <Property Id="APPLICATIONFOLDER">
      <RegistrySearch Id='InstallationRegistrySearch' Type='raw' Root='HKLM' Key='Software\$(var.Manufacturer)\$(var.AppName)' Name='InstallDir' />
    </Property>

    <Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
    <Property Id="ALLUSERS" Value="1"/>

    [...]

    <UI>
      [...]
      <UIRef Id="WixUI_Advanced"/>
    </UI>
</Product>

Что мы делаем неправильно?

1 Ответ

0 голосов
/ 09 октября 2018

Помните свойства : значения свойств не сохраняются автоматически в MSI, следовательно, необходимы шаблоны, такие как " Помните образец свойства . "?Другими словами, вы читаете из x64-раздела реестра, а не из x86-раздела ?(или наоборот).

  • HKEY_LOCAL_MACHINE\SOFTWARE\Manufacturer\Acme\Program

  • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Manufacturer\Acme\Program

...