Вопрос

Я пытаюсь создать небольшое диалоговое окно "предварительные требования" в Wix, чтобы дать пользователям уверенность в том, что у них есть все необходимое для запуска моего программного обеспечения:

Например, мне нужен управляемый DirectX, поэтому я ищу несколько библиотек DLL:

<Property Id="MANAGED_DIRECTX">
  <DirectorySearch Path="$(env.SystemRoot)\Microsoft.NET\DirectX for Managed Code\1.0.2902.0" Depth="0" Id="MDXDir">
    <FileSearch Name="Microsoft.DirectX.dll"/>
  </DirectorySearch>
</Property>

<Property Id="MANAGED_DIRECTX_DIRECTINPUT">
  <DirectorySearch Path="$(env.SystemRoot)\Microsoft.NET\DirectX for Managed Code\1.0.2902.0" Depth="0" Id="MDXInputDir">
    <FileSearch Name="Microsoft.DirectX.DirectInput.dll"/>
  </DirectorySearch>
</Property>

У меня также есть CustomAction для объединения моей логики условий:

<CustomAction Id="SetManagedDirectXInstalled"
              Property="MANAGED_DIRECTX_INSTALLED"
              Value="NOT([MANAGED_DIRECTX] = '') AND NOT ([MANAGED_DIRECTX_DIRECTINPUT] = ''")/>

Это пользовательское действие выполняется последовательно:

<InstallExecuteSequence>
  <Custom Action="SetManagedDirectXInstalled" After="AppSearch" />
  <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

Что я теперь должен быть в состоянии сделать, так это использовать "УСТАНОВЛЕННЫЙ УПРАВЛЯЕМЫЙ DIRECTX", чтобы что-то сделать, например

    <Control Id="NoManagedDirectX" Type="Text" X="20" Y="50" Width="300" Height="60" Transparent="yes" NoPrefix="yes" Hidden="yes">
      <Text>Microsoft Managed DirectX (MDX) for DirectX 9.0 is NOT installed</Text>
      <Condition Action="show">NOT MANAGED_DIRECTX_INSTALLED</Condition>
    </Control>
    <Control Id="ManagedDirectX" Type="Text" X="20" Y="50" Width="300" Height="60" Transparent="yes" NoPrefix="yes" Hidden="yes">
      <Text>Microsoft Managed DirectX (MDX) for DirectX 9.0 is correctly installed</Text>
      <Condition Action="show">MANAGED_DIRECTX_INSTALLED</Condition>
    </Control>

Не имеет значения, что я делаю, условие всегда равно false (напримерне установлен), даже когда я знаю, что файлы там есть.Использование команды msiexec с /l* vx нигде не показывает УПРАВЛЯЕМОЕ УСТАНОВЛЕННОЕ свойство DIRECTX.

Когда a <Condition> используется со следующим, он успешно предотвращает установку (хотя я больше не хочу блокировать установки в этом случае, просто советую).

<Condition Message="You must have Microsoft Managed DirectX (MDX) for DirectX 9.0 installed">
  MANAGED_DIRECTX AND MANAGED_DIRECTX_DIRECTINPUT
</Condition>

Как я могу отследить / отладить это (или что я сделал не так?)


Редактировать - Теперь я уверен, что мое CustomAction даже не вызывается, установка для него следующего значения также не показывает ожидаемых результатов!

<CustomAction Id='SetManagedDirectXInstalled'
              Property='MANAGED_DIRECTX_INSTALLED'
              Value='Something hard-coded'/>

или

<CustomAction Id='SetManagedDirectXInstalled'
              Error='Some error should show!'/>
Это было полезно?

Решение

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

Похоже, я должен сравнить значения с TRUE / FALSE (или пустой строкой), а не просто ожидать, что они будут работать как логические (Источник)

В этих выражениях вы можете использовать имена свойств (помните, что они чувствительны к регистру).Несуществующее свойство имена будут обрабатываться как пустые строки.Логическое значение свойства отражает, было ли оно установлено — это означает, что вы не можете проверить наличие логического значения простым использованием свойства:

  • СОБСТВЕННОСТЬ
    Это значение будет равно true, если свойство было установлено и имеет любое значение, даже если это значение равно false.
  • НЕ СОБСТВЕННОСТЬ
    Это значение будет равно true, если свойство вообще не было установлено.
  • СВОЙСТВО = TRUE
  • СВОЙСТВО = FALSE
    Это правильный способ проверить значение логического свойства.

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

<Ол>
  • Для отладки используйте подробный файл журнала. Он покажет вам состояние ваших свойств по мере их изменения. После этого вы сможете оценить состояние с этими знаниями

  • Я ответил на этот же вопрос не так давно здесь. Условие, которое использует имя свойства, является тестом на существование. Тест существования для свойства оценивается как true, если свойство вообще имеет какое-либо значение. Если вы хотите проверить значение свойства, вам нужно сделать это явно.

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