3

WiX 工具集允许创建条件安装以检查系统上是否安装了所有先决条件。问题是这些条件是单独检查的。我想在一个列表中向用户显示所有尚未安装的先决条件。有没有办法在 WiX 中实现这一点?

4

1 回答 1

4

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

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

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;
于 2013-08-23T13:46:11.573 回答