2008-12-16 15 views
7

Estoy escribiendo una acción personalizada administrada. Estoy usando DTF Framework desde Windows Installer Xml para envolver el dll administrado en un dll de CA utilizable. El CA hace lo que se supone que es, pero sigo teniendo problemas con el manejo de errores:¿Cómo se muestra el mensaje de error utilizando acciones personalizadas administradas con Windows Installer?

Dim record As New Record(1) 

' Field 0 intentionally left blank 
' Field 1 contains error number 
record(1) = 27533 
session.Message(InstallMessage.Error, record) 

El código anterior produce el siguiente texto que figura en el registro de MSI:

MSI (c) (C4! C6) [13: 15: 08: 749]: Producto: TestMSI - Error 27533. Las contraseñas que distinguen entre mayúsculas y minúsculas no coinciden.

El número de error se refiere al código que figura en la tabla de errores dentro de la MSI. El mensaje que se muestra arriba es correcto.

Mi problema es: ¿Por qué Windows Installer NO crea un cuadro de diálogo que notifica al usuario sobre el error?

Respuesta

-1

Si desea que aparezca un cuadro de diálogo que contiene el mensaje, debe hacerlo usted mismo.

Aquí hay un código que utilizo para manejar errores en acciones personalizadas administradas que ejecutan SQL. Muestra un cuadro de mensaje si la instalación está funcionando con una IU completa. Está en C# pero espero que te hagas una idea.

private void _handleSqlException(SqlException ex) 
    { 
     StringBuilder errorMessage = new StringBuilder(); 
     errorMessage.Append("A SQL error has occurred."); 
     for (int i = 0; i < ex.Errors.Count; i++) 
     { 
      errorMessage.Append("Index #" + i + "\n" + 
       "Message: " + ex.Errors[i].Message + "\n" + 
       "LineNumber: " + ex.Errors[i].LineNumber + "\n" + 
       "Source: " + ex.Errors[i].Source + "\n" + 
       "Procedure: " + ex.Errors[i].Procedure + "\n"); 
     } 
     session.Log(errorMessage); 
     if (session["UILevel"] == "5") 
     { 
      MessageBox.Show(errorMessage); 
     } 
    } 
+3

esta no es la forma más aceptada de hacer esto ya que la ventana del mensaje puede aparecer detrás del instalador, y se lanzará con diferentes privilegios, creo –

13

MSI puede hacer esto, pero necesita O en algunos valores adicionales para el argumento messageType.

por ejemplo.

Record record = new Record(); 
record.FormatString = string.Format("Something has gone wrong!"); 

session.Message(
    InstallMessage.Error | (InstallMessage) (MessageBoxIcon.Error) | 
    (InstallMessage) MessageBoxButtons.OK, 
    record); 

Ver this thread de los usuarios de Wix-lista de correo para más detalles.

2

Hola, gracias por la información.

¿Sabes si hay una forma de mostrar grandes mensajes? Cuando uso:

Record record = new Record(); record.FormatString = pReallyBigMessage;

  Session.Message(InstallMessage.Error | (InstallMessage)System.Windows.Forms.MessageBoxIcon.Warning | 
       (InstallMessage)System.Windows.Forms.MessageBoxButtons.OK, record); 

Solo se muestran repuestos. Me gustaría seguir con la funcionalidad Session.Message y no usar el cuadro de diálogo Windows.Forms debido al enfoque.

Saludos

2

se han topado con el mismo problema, de acuerdo con Wix: de A Guía del desarrollador de Windows Installer XML por Nick Ramírez, los métodos de registro y mensajes no funcionan cuando una acción personalizada se llama desde una interfaz de usuario controlar.

Cuestiones relacionadas