我试图使用自定义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动作序列的顺序,或者指定可以在这种情况下使用的任何其他方法。
答案 0 :(得分:2)
有两个序列:InstallExecuteSequence
和InstallUISequence
。如果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
可以是Edit
或MaskedEdit
。 Publish
个元素应与对话框中的 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