es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>
Tags:  , ,

Answer

  1. Avatar for 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ón caNextButton solo si la verificación es exitosa. Para avanzar a la siguiente pantalla, puede utilizar la función MsiProcessMessage para simular un evento de presión de botón. Aquí hay un ejemplo de implementación de la función caNextButton:

    “`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);

    // Realizar la verificación en el valor
    if (_tcslen(szConfigValue) == 0)
    {
        // Establecer un mensaje de error para mostrar en el cuadro de diálogo
        MsiMessageBox(hInstall, _T("Por favor ingrese un valor."), NULL, MB_OK | MB_ICONERROR);
        return ERROR_FUNCTION_FAILED;
    }
    
    // Habilitar el botón "Siguiente"
    MsiSetProperty(hInstall, _T("NextEnabled"), _T("1"));
    
    // Simular un evento de presión de botón para avanzar a la siguiente pantalla
    UINT iResult = MsiProcessMessage(hInstall, INSTALLMESSAGE_ACTIONSTART, 0, 0);
    
    return iResult;
    

    }
    “`

    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 utilizando MsiMessageBox y la función devuelve ERROR_FUNCTION_FAILED, lo cual evitará que se muestre la pantalla “Siguiente”. Si la verificación es exitosa, se habilita el botón “Siguiente” utilizando MsiSetProperty y se utiliza MsiProcessMessage para simular un evento de presión de botón y avanzar a la siguiente pantalla. Finalmente, la función devuelve el resultado de MsiProcessMessage para indicar el éxito.

Comments are closed.