2016-05-20 4 views
0

Я пытаюсь создать установщик WiX для плагина одного из моих приложений, но натолкнулся на то, что я нахожу странным; возможно, это ожидаемое поведение, но тогда я хотел бы знать, почему.WiX извлекает путь из путаницы реестра

Мое приложение сохраняет свой путь установки в следующем разделе реестра:

HKEY_CURRENT_USER \ SOFTWARE \ MyCompany \ MyApp \ Installed

По умолчанию мое приложение устанавливается в C: \ Program Files \ MyApp, если x64 и C: \ Program Files (x86) \ MyApp, если x86.

В моем плагине установщиком я следующее Product.wxs, чтобы получить путь установки моего приложения:

<Property Id="MY_APP_DIR"> 
    <RegistrySearch Id='my_app_dir' Type='raw' Root='HKCU' Key='SOFTWARE\MyCompany\MyApp' Name='Installed' /> 
</Property> 

Затем я добавил следующее, чтобы посмотреть, что на самом деле извлекается при запуске программы установки:

<Condition Message="[MY_APP_DIR]"> 
    0 
</Condition> 

в случае, когда «C: \ Program Files \ MyApp \» хранится в реестре, я получил следующее при запуске программы установки плагина:

плагин в Staller (x86): C: \ Program Files (x86) \ MyApp \

Plugin инсталлятор (x64): C: \ Program Files \ MyApp \

Почему не значение хранится в реестре извлекается независимо на какой платформе был создан msi?

На машине x64 будут использоваться только 64-разрядные версии моих установщиков, поэтому это не должно вызывать никаких проблем, это просто смущает меня.

EDIT: В соответствии с просьбой, я включил весь мой Product.wxs:

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Product Id="*" Name="TestInstaller" Language="1033" Version="1.0.0.0" Manufacturer="MyCompany" UpgradeCode="SOME_GUID"> 
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" /> 

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." /> 
    <MediaTemplate EmbedCab="yes" /> 

    <Property Id="MY_APP_DIR"> 
     <RegistrySearch Id="my_app_dir" Root="HKCU" Key="SOFTWARE\MyCompany\MyApp" Name="Installed" Type="raw" /> 
    </Property> 

    <Condition Message="[MY_APP_DIR]"> 
     0 
    </Condition> 

    <Feature Id="ProductFeature" Title="TestInstaller" Level="1"> 
     <ComponentGroupRef Id="ProductComponents" /> 
    </Feature> 
    </Product> 

    <Fragment> 
    <Directory Id="TARGETDIR" Name="SourceDir"> 
    <Directory Id="INSTALLFOLDER" Name="TestInstaller"> 
     <Directory Id="MY_APP_DIR" Name="MyAppInstallPath"> 
     <Directory Id="MyAppBinFolder" Name="bin" /> 
     </Directory> 
    </Directory> 
    </Directory> 
    </Fragment> 
    <Fragment> 
    <ComponentGroup Id="ProductComponents"> 
     <Component Id="ProductComponent" Guid="SOME_GUID" Directory="MyAppBinFolder"> 
     <File Id="Foo.Bar" Source="Foo.Bar" KeyPath="yes" /> 
     </Component> 
    </ComponentGroup> 
    </Fragment> 
</Wix> 
+0

Не могли бы вы предоставить более подробную информацию о том, как «MY_APP_DIR» используется в вашем установщике WiX? Например, он ссылается на элемент «Directory»? – bradfordrg

+0

@bradfordrg У меня нет кода со мной прямо сейчас, но да, я использую его в элементе Directory. Как прямой дочерний элемент в элементе '', если я правильно помню. – dbostream

ответ

1

установщика Windows имеет правило под названием WIN64DUALFOLDERS, которая не позволяет 32-битные инсталляторы написать 64-битных местах. Если запустить 32 битную версию программы установки на 64 разрядном компьютере с диагностической журнализацией вы должны увидеть раздел в файле журнал, как это:

AppSearch: Property: MY_APP_DIR, Signature: my_app_dir 
MSI (c) (BC:F4) [10:00:47:953]: Note: 1: 2262 2: Signature 3: -2147287038 
MSI (c) (BC:F4) [10:00:47:953]: WIN64DUALFOLDERS: 'C:\Program Files (x86)\' will substitute 17 characters in 'C:\Program Files\MyCompany\MyApp' folder path. (mask argument = 0, the folder pair's iSwapAttrib member = 0). 
MSI (c) (BC:F4) [10:00:47:953]: PROPERTY CHANGE: Adding MY_APP_DIR property. Its value is 'C:\Program Files (x86)\MyCompany\MyApp'. 
Action ended 10:00:47: AppSearch. Return value 1. 

Даже если путь в реестре C:\Program Files\, установщик Windows автоматически перенаправляет его до C:\Program Files (x86)\.

Для получения дополнительной информации см. Disable WIN64DUALFOLDERS substitution in WIX.

Примечание: Я удалил свой предыдущий ответ, потому что, пользуясь ретроспективностью, это было бесполезно.

+0

Спасибо за разъяснение, теперь я знаю почему. – dbostream

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