我在wix安装程序中有一个非常冗长的CustomAction,我希望能够在操作运行时更改“Status:...”文本,以查看是否有进度并更新其内部状态。 我知道如何设置自定义操作的progresstext - 但我想要的是在自定义操作运行期间动态更改进度文本。
答案 0 :(得分:9)
延迟自定义操作可以调用MsiProcessMessage函数。然后,您可以使用INSTALLMESSAGE_ACTIONSTART,INSTALLMESSAGE_ACTIONDATA和INSTALLMESSAGE_PROGRESS将消息发布到UI。
另一种可能性是将自定义操作分解为较小的自定义操作,并使用ProgressText(ActionText表)来描述不同的安装阶段。 (使每个CA都有一个责任。)
有时,当CA做太多工作时,很难正确规划回滚。
Obtaining Context Information for Deferred Execution Custom Actions
使用C#/ DTF,它看起来像:
using (Record record = new Record(0))
{
record.SetString(0, "foo");
session.Message(InstallMessage.ActionData, record);
}
using语句处理记录以释放底层的MSI句柄。记录中的字段数以及设置数据的方式将取决于ActionText表中定义的模板。
答案 1 :(得分:1)
Chris已正确解释了如何从您的CA向ActionData
发送邮件,但如果您使用的是InstallShield,请确保在SetupProgress
对话框中创建标签并订阅{{1} } text event to it。简单地说,为标签创建ActionData
事件是不够的,因为它只显示您在ActionText表中创建的CA描述。
答案 2 :(得分:0)
以上答案对我不起作用。状态永远不会更新。
在我的情况下,直接调用AddProgressInfo函数即可。
Action<Session, string> updateStatusMessage = (session, msg) =>
{
session.Message(InstallMessage.ActionStart, new Record("callAddProgressInfo", msg, ""));
};