Cómo pasar programáticamente a la siguiente pantalla en el instalador MSI desde una acción personalizada?
Tengo un cuadro de diálogo personalizado de WiX llamado ConfigDlg
con mis propios controles en él:
<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>
Necesito programar el botón “Siguiente” para verificar lo que el usuario ingresó en mi ConfigDlg y no permitir la pantalla “Siguiente” si dicha verificación falla. Entonces, cambié mi XML para llamar a mi acción personalizada idCA_NextBtn
de la siguiente manera:
<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>
donde:
<Binary Id="caBinDll" SourceFile="$(var.SourceFldrBld)ca_Installer.dll" />
<CustomAction Id="idCA_NextBtn" Execute="immediate" BinaryKey="caBinDll" DllEntry="caNextButton" Return="check" />
Mi función caNextButton
en la DLL de acción personalizada se ejecuta, pero no estoy seguro de cómo avanzar a la siguiente pantalla (o VerifyReadyDlg
) desde ella:
extern "C" UINT APIENTRY caNextButton(MSIHANDLE hInstall)
{
return ERROR_SUCCESS;
}
¿O cómo simularlo?
<Publish Dialog="ConfigDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
davy.ai
Para deshabilitar la pantalla “Siguiente” si la verificación falla, puede establecer el botón
Siguiente
como desactivado inicialmente y luego habilitarlo en la funcióncaNextButton
solo si la verificación es exitosa. Para avanzar a la siguiente pantalla, puede utilizar la funciónMsiProcessMessage
para simular un evento de presión de botón. Aquí hay un ejemplo de implementación de la funcióncaNextButton
:“`c++
extern “C” UINT APIENTRY caNextButton(MSIHANDLE hInstall)
{
// Obtener el valor del control de edición personalizado
TCHAR szConfigValue[MAX_PATH] = { 0 };
DWORD dwSize = MAX_PATH;
MsiGetProperty(hInstall, _T(“CONFIGEDITVALUE”), szConfigValue, &dwSize);
}
“`
Tenga en cuenta que la función de acción personalizada recupera el valor de un control de edición personalizado utilizando
MsiGetProperty
y realiza una verificación en él. Si la verificación falla, se muestra un mensaje de error utilizandoMsiMessageBox
y la función devuelveERROR_FUNCTION_FAILED
, lo cual evitará que se muestre la pantalla “Siguiente”. Si la verificación es exitosa, se habilita el botón “Siguiente” utilizandoMsiSetProperty
y se utilizaMsiProcessMessage
para simular un evento de presión de botón y avanzar a la siguiente pantalla. Finalmente, la función devuelve el resultado deMsiProcessMessage
para indicar el éxito.