Nano Hash - криптовалюты, майнинг, программирование

WiX извлекает путь из путаницы в реестре

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

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

HKEY_CURRENT_USER \ SOFTWARE \ MyCompany \ MyApp \ Установлено

По умолчанию мое приложение установлено в 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 \" хранится в реестре, я получил следующее при запуске установщика плагина:

Установщик плагина (x86): C: \ Program Files (x86) \ MyApp \

Установщик плагина (x64): C: \ Program Files \ MyApp \

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

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

РЕДАКТИРОВАТЬ: По запросу я включил весь свой 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>
20.05.2016

  • Не могли бы вы подробнее рассказать о том, как MY_APP_DIR используется в вашем установщике WiX? Например, имеется ли ссылка в элементе Directory? 22.05.2016
  • @bradfordrg У меня сейчас нет кода с собой, но да, я использую его в элементе каталога. Как прямой потомок элемента <Directory Id="TARGETDIR" Name="SourceDir">, если я правильно помню. 22.05.2016

Ответы:


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)\.

Для получения дополнительной информации см. Отключить замену WIN64DUALFOLDERS в WIX.

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

23.05.2016
  • Спасибо за разъяснения, теперь я знаю почему. 23.05.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..