سؤال

أحاول تجميع مربع حوار صغير "للمتطلبات الأساسية" في Wix لمنح الثقة للمستخدمين بأن لديهم كل الأشياء المطلوبة اللازمة لتشغيل برنامجي:

على سبيل المثال، أنا بحاجة إلى Managed 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>

ما يجب أن أكون قادرًا على فعله الآن هو استخدام "MANAGED DIRECTX INSTALLED" للقيام بشيء ما، على سبيل المثال.

    <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>

لا يهم ما أفعله، فالشرط دائمًا خاطئ (على سبيل المثال:غير مثبتة) حتى عندما أعرف أن الملفات موجودة.استخدام الأمر msiexec مع /l*vx لا يُظهر خاصية MANAGED DIRECTX INSTALLED في أي مكان.

عند استخدام <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 (أو سلسلة فارغة) وليس فقط أتوقع أن تعمل كقيمة منطقية (مصدر)

في هذه التعبيرات ، يمكنك استخدام أسماء الممتلكات (تذكر أنها حساسة للحالة).سيتم التعامل مع أسماء الممتلكات غير الموجودة على أنها سلاسل فارغة.تعكس القيمة المنطقية للخاصية ما إذا كانت قد تم تعيينها - مما يعني أنه لا يمكنك التحقق من قيمة منطقية بمجرد استخدام الخاصية:

  • ملكية
    سيؤدي ذلك إلى تقييم صحيح إذا تم تعيين الخاصية ولديه أي قيمة ، حتى لو كانت هذه القيمة خاطئة.
  • ليست ملكية
    سيتم تقييم هذا على أنه صحيح إذا لم يتم تعيين الخاصية على الإطلاق.
  • الملكية = صحيح
  • الخاصية = خطأ
    هذه هي الطريقة الصحيحة للتحقق من قيمة الخاصية المنطقية.

نصائح أخرى

  1. لتصحيح الأخطاء، استخدم ملف سجل مطول.وسوف تظهر لك حالات الممتلكات الخاصة بك عندما تتغير.يجب أن تكون قادرًا بعد ذلك على تقييم الحالة بهذه المعرفة

  2. لقد أجبت على هذا السؤال نفسه منذ وقت ليس ببعيد هنا.الشرط الذي يستخدم اسم الخاصية هو اختبار للوجود.يتم تقييم اختبار وجود الخاصية على أنه صحيح إذا كانت الخاصية لها أي قيمة على الإطلاق.إذا كنت تريد التحقق من قيمة خاصية ما، فيجب عليك القيام بذلك بشكل صريح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top