WiX工具集 - 一次检查所有安装先决条件(有条件的安装)

时间:2013-08-23 13:27:40

标签: wix windows-installer

WiX Toolset允许创建条件安装以检查系统上是否安装了所有先决条件。问题是这些条件是分开检查的。我想在一个列表中向用户显示所有尚未安装的前提条件。有没有办法在WiX中实现这一目标?

1 个答案:

答案 0 :(得分:4)

在Fragment或Product元素下使用时,WiX Condition元素表示LaunchCondition Table中的条目,由LaunchConditions Action处理。您看到的行为是对该基础功能的限制。

这是我7年前撰写的一篇博客文章:

Short Comings of LaunchConditions

可悲的是,微软从未接受过我的改进建议。因此,您不必使用Condition元素,而是必须编写自己的自定义表和自定义操作来进行处理。

我在InstallScript和C#中有这样的示例代码,但我从未在C / C ++中编写它。

以下是InstallScript中的精简示例。将其作为伪代码读取,以便在C / C ++中进行重构。您还需要创建SQL查询使用的自定义表,定义和计划自定义操作(我通常在FindRelatedProducts之后安排它),并创建用于显示错误文本的自定义对话框。所有这些都是未包含的WiX XML。

hDatabase = MsiGetActiveDatabase(hMSI);
MsiDatabaseOpenView(hDatabase, "SELECT `Condition`, `Description` FROM `CustomLaunchConditions` ORDER BY `Ordering`", hView );
MsiViewExecute(hView, 0);

if( MsiViewFetch(hView, hRecord) == ERROR_SUCCESS ) then
  loop = TRUE;
  while(loop)
    nvBufferSize = MAX_STRING;
    MsiRecordGetString(hRecord, 1, svProperty, nvBufferSize );

    if(!MsiEvaluateCondition(hMSI, svProperty)) then
      nvBufferSize = MAX_STRING;
      MsiRecordGetString(hRecord, 2, svValue, nvBufferSize );
      hFormatRecord = MsiCreateRecord(1);
      MsiRecordSetString(hFormatRecord, 0, svValue);
      nvBufferSize = MAX_STRING;
      MsiFormatRecord(hMSI, hFormatRecord, svResult, nvBufferSize);
      svWarningMessage = svWarningMessage + svResult + "\r\n";
    endif;

    if( MsiViewFetch(hView, hRecord) != ERROR_SUCCESS) then
      loop = FALSE;
    endif;
  endwhile;
  MsiSetProperty(hMSI, "CustomLaunchConditionsText", svWarningMessage);
endif;