我想在 WiX 安装程序的条件消息中使用 MSI 安装程序属性。此 MSI 属性由 C++ 自定义操作设置。我可以在调用条件消息之前设置和获取相同的 MSI 属性和值,但在条件消息中使用它时会失败。
我的状况信息看起来像
<CustomAction Id="CustomAction1" BinaryKey="CustomDLL"
DllEntry="CustomAction1" Execute="immediate" Return="check" />
<InstallUISequence>
<Custom Action="CustomAction1" Before="LaunchConditions">Not Installed</Custom>
</InstallUISequence>
<InstallExecuteSequence >
<Custom Action="CustomAction1" Before="LaunchConditions">Not Installed</Custom>
</InstallExecuteSequence>
<Condition Message="message comes here.">
<![CDATA[(MyProperty= "NO")]]>
</Condition>
此处的 MyProperty 是一个字符串,返回 YES 或 NO,它由 C++ CA 设置,并且此条件在两种情况下均失败。但我希望仅在 MyProperty 设置为“NO”时显示此消息。
那么,如何在由自定义操作设置的条件消息中使用自定义 MSI 属性?
答案1
我会尝试大写使其MyProperty
成为公共财产,然后我还会通过以下方式在 WiX 源中声明它Property 元素并将 设置Secure attribute
为Yes
,看看是否有帮助。WiX 标记:
<Property Id='MYPROPERTY' Secure='yes' />
我还会在您在 C++ 自定义操作中设置该属性后检索该属性,以确定它是否已正确设置(它可能为空白)。使用 VBScript,您可以非常轻松地检索该属性。这是一个示例(VBScript 有助于避免任何编译,您可以将源代码嵌入自定义操作中 - 非常适合测试目的 - 并使用它仅有的用于测试目的):
MsgBox Session.Property("MYPROPERTY")
作为 WiX 元素,类似于此(现在无法测试 - 尝试一下 - 记得插入InstallUISequence
或InstallExecuteSequence
):
<CustomAction Id="Test" Script="vbscript">
<![CDATA[MsgBox Session.Property("MYPROPERTY")]]>
</CustomAction>
我相信这应该能帮助你理清真正的问题所在。
您可以使用WiX 属性元素通过直接对值进行硬编码来测试条件(以防 C++ 代码集属性调用是问题所在)。以下操作应使启动条件评估为 false(触发您指定显示的消息):
<Property Id='MYPROPERTY' Secure='yes' Value="YES" />
答案2
编码问题最好放在https://stackoverflow.com/
这个问题的答案比它应该的要复杂得多。请检查这篇文章是否能让你找到正确的方向,我会再回来检查你的问题是否得到解决:https://stackoverflow.com/questions/3252448/visual-studio-deployment-project-customactiondata
除了该问题提到的内容之外,请确保您的财产在“安全财产”的分隔列表中列出安全自定义属性财产。
所有这些复杂性都源于 Windows Installer 复杂的“提升权限”概念,该概念允许非管理员用户有时以提升的权限进行安装。要实现这一点,在以提升的权限运行的事务中不能直接访问任何属性,您必须专门将它们的值写入执行脚本,并以相当奇特的方式检索它们,正如您将在链接的文章中看到的那样。它涉及读回一个名为自定义动作数据。
最后,也是最重要的一点;发布于stackoverflow.com还有。WiX 可能有一个更先进的方法来处理这个阶段的复杂性,但我还不知道。某种自动化的魔法。