我试图使用自定义 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 动作序列的顺序,或者指定可以在这种情况下使用的任何其他方法。