WiX 工具集允许创建条件安装以检查系统上是否安装了所有先决条件。问题是这些条件是单独检查的。我想在一个列表中向用户显示所有尚未安装的先决条件。有没有办法在 WiX 中实现这一点?
问问题
1011 次
1 回答
4
WiX Condition 元素在 Fragment 或 Product 元素下使用时表示LaunchCondition 表中的一个条目,并由LaunchConditions Action处理。您看到的行为是该基础功能的限制。
这是我 7 年前写的一篇博客文章:
遗憾的是,微软从未采纳我的改进建议。因此,您必须编写自己的自定义表和自定义操作来进行处理,而不是使用 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 回答