2

我试图使用自定义 dll 来检查用户输入的注册号,但我每次都遇到“魔术”行为。在教程示例http://wix.tramontana.co.hu/tutorial/events-and-actions/whats-not-in-the-book中,自定义操作在“CostFinalize”之后运行,通常应该在文件复制之前过程,但事实证明该操作在第一个带有许可协议的对话框出现之前运行。我试图通过在注册对话框中单击“下一步”按钮的事件分配一个动作来解决这个问题

<Publish Dialog="MySerialCheckDlg" Control="Next" Event="DoAction"      Value="CheckingPID">1</Publish>
<Publish Dialog="MySerialCheckDlg" Control="Next" Event="SpawnDialog" Value="InvalidPidDlg">PIDACCEPTED = "0"</Publish>
...
<CustomAction Id="CheckingPID" BinaryKey="CheckPID" DllEntry="CheckPID" />

<Binary Id="CheckPID" SourceFile="serialcheck.dll" />

在 dll 中,使用MsiGetProperty (hInstall, "PIDKEY", Pid, &PidLen);不会从 MySerialCheckDlg UI 中指定的 msi 获取 PIDKEY 值

<Control Id="CDKeyEdit" Type="Edit" X="45" Y="159" Width="220" Height="16" Property="PIDKEY" Text="[PIDTemplate]" />

并且在 msi 中,未在行中检查 PIDACCEPTED 属性

<Publish Dialog="MySerialCheckDlg" Control="Next" Event="SpawnDialog" Value="InvalidPidDlg">PIDACCEPTED = "0"</Publish>

因此,不会出现 InvalidPidDlg,安装过程会继续进行。

您能否指定 WiX 动作序列的顺序,或者指定可以在这种情况下使用的任何其他方法。

4

1 回答 1

2

有两个序列:InstallExecuteSequenceInstallUISequence。如果 MSI 以完整的 UI 运行,它会执行以下操作InstallUISequence;如果没有显示 UI,则会跳过这些操作。操作从InstallExecuteSequence在安装过程中执行,有或没有 UI。

首先,您的PIDKEY属性是否与编辑控件相关联?您应该在要求用户输入 PIDKEY 的对话框中使用类似的内容:

<Control Id="PidKeyEdit" Type="Edit" X="45" Y="105" Width="220" Height="18" Property="PIDKEY" Text="{80}" />

Type可以是EditMaskedEditPublish元素应与对话框上的Next按钮控件相关联:

<Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17"
         Default="yes" Text="Next">
    <Publish Event="DoAction" Value="CheckingPID">1</Publish>
    <Publish Event="SpawnDialog" Value="InvalidPidDlg">PIDACCEPTED = "0"</Publish>
</Control>

使用详细日志记录运行您的安装,以查看操作是如何执行的,以及属性值如何变化:

msiexec /i your-product.msi /lv* your-product.log
于 2011-08-18T06:30:21.100 回答