如何以编程方式从自定义操作转到 MSI 安装程序中的下一个屏幕?

How to programmatically go to the next screen in the MSI installer from a custom action?

我有一个 WiX 自定义对话框 ConfigDlg,里面有我自己的控件:

  <Fragment>    
    <UI Id="My_WixUI_Mondo">

      <Publish Dialog="ConfigDlg" Control="Back" Event="NewDialog" Value="CustomizeDlg">1</Publish>
      <Publish Dialog="ConfigDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>

    </UI>
  </Fragment>

我需要对“下一步”按钮进行编程以检查用户在我的 ConfigDlg 中输入的内容,如果检查失败则禁止“下一步”屏幕。所以我改变了我的 XML 来调用我的 idCA_NextBtn 自定义操作:

  <Fragment>    
    <UI Id="My_WixUI_Mondo">

      <Publish Dialog="ConfigDlg" Control="Back" Event="NewDialog" Value="CustomizeDlg">1</Publish>
      <Publish Dialog="ConfigDlg" Control="Next" Event="DoAction" Value="idCA_NextBtn">1</Publish>

    </UI>
  </Fragment>

其中:

<Binary Id="caBinDll" SourceFile="$(var.SourceFldrBld)ca_Installer.dll" />
<CustomAction Id="idCA_NextBtn" Execute="immediate" BinaryKey="caBinDll" DllEntry="caNextButton" Return="check" />

我在自定义操作 DLL 中的 caNextButton 函数被调用,但我不确定如何从它前进到下一个屏幕(或 VerifyReadyDlg):

extern "C" UINT APIENTRY caNextButton(MSIHANDLE hInstall)
{
    return ERROR_SUCCESS;
}

还是模拟?

  <Publish Dialog="ConfigDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>

控件可以有多个ControlEvents(发布元素)并且它们是按顺序处理的。您要做的是先调用自定义操作,然后将 SomeProperty 设置为 null 或 1,然后有两个互斥事件。

发布 DoAction CustomActionName 条件 1 (true/always)

发布 SpawnDialog CustomBrandedMessageBoxDialog 条件不是 SomeProperty

发布 NewDialog VerifyReadyDlgCondition SomeProperty