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