Control de errores en acciones personalizadas

Actualización: noviembre 2007

Aunque Windows Installer administra de manera automática prácticamente todo el control de errores en la implementación, los errores en acciones personalizadas pueden hacer fallar un instalador. Todas las acciones personalizadas contienen código y, como en cualquier código, el control de errores constituye una parte fundamental de todo el proceso. Por ejemplo, si una acción personalizada incluye código para abrir un archivo que falta, será necesario un controlador de errores para comunicarle el error a Windows Installer y permitir que la instalación pueda ser detenida.

Nota:

En el caso de acciones personalizadas escritas con JScript o VBScript, el error no se devolverá a Windows Installer y la instalación no podrá interrumpirse; en su lugar, puede mostrarse un cuadro de diálogo de error al usuario. Las acciones personalizadas que resulten fundamentales para una instalación deberían escribirse en Visual Basic, Visual C# o Visual C++ para permitir que los posibles errores se pasen a Windows Installer.

Interceptar el error

Para controlar un error en una acción personalizada, es necesario agregar código capaz de interceptarlo y pasar la información correspondiente a Windows Installer. Los ejemplos siguientes muestran cómo controlar un error en Visual Basic, Visual C#, Visual C++, JScript y código VBScript:

' Uses System.IO and System.Configuration.Install
Dim Info As New FileInfo("MyFile.txt")
If Not Info.Exists Then
    Throw New InstallException("File does not exist")
End If
// Uses System.IO and System.Configuration.Install
FileInfo Info = new FileInfo("MyFile.txt");
if (Info.Exists == false)
   throw new InstallException("File does not exist");
'VBScript
msiMessageTypeError = &H01000000 
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists("c:\MyFile.txt") Then
   Set record = Session.Installer.CreateRecord(0)
   record.StringData(0) = "File not found."
   Session.Message msiMessageTypeError, record
End If
var msiMessageTypeError = 0x01000000;
var fso = new ActiveXObject("Scripting.FileSystemObject");
if (!fso.FileExists("c:\\MyFile.txt"))
{
   var record = Session.Installer.CreateRecord(0);
   record.StringData(0) = "File not found.";
   Session.Message(msiMessageTypeError, record);
}
#pragma comment(lib, "msi.lib")

#include <windows.h>
#include <msiquery.h>

BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD fdwREason, LPVOID lpReserved)
{
   return TRUE;
}

extern "C" __declspec(dllexport) __stdcall Install(MSIHANDLE hInstall)
{
   if (GetFileAttributes(TEXT("c:\\MyFile.txt")) == -1)
   {
      PMSIHANDLE hRecord = MsiCreateRecord(0);
      MsiRecordSetString(hRecord, 0, TEXT("File does not exist."));
      MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord);
      return ERROR_INSTALL_USEREXIT;
   }
   
   return ERROR_SUCCESS;
}

Vea también

Otros recursos

Administración de acciones personalizadas en la implementación