Gestion des erreurs dans les actions personnalisées

Windows Installer assure automatiquement et en grande partie la gestion des erreurs lors du déploiement. Cependant, des erreurs survenues lors d'actions personnalisées peuvent entraîner l'échec d'un programme d'installation. Toutes les actions personnalisées contiennent du code ; comme avec tout code, la gestion des erreurs constitue une partie essentielle du processus. Par exemple, si une action personnalisée contient du code permettant d'ouvrir un fichier et que ce fichier est manquant, un gestionnaire d'erreurs est nécessaire pour signaler l'erreur à Windows Installer afin que l'installation soit annulée.

Notes

Pour les actions personnalisées écrites à l'aide de JScript ou VBScript, l'erreur n'est pas retournée à Windows Installer et l'installation ne peut pas être annulée ; une boîte de dialogue d'erreur peut s'afficher. Les actions personnalisées qui sont importantes pour une installation doivent être écrites en Visual Basic, Visual C# ou Visual C++ afin de passer l'erreur à Windows Installer.

Interception d'une erreur

Pour gérer une erreur d'une action personnalisée, vous devez ajouter du code pour intercepter l'erreur et passer les informations à nouveau à Windows Installer. Les exemples suivants montrent comment gérer une erreur dans du code Visual Basic, Visual C#, Visual C++, JScript et 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;
}

Voir aussi

Autres ressources

Gestion des actions personnalisées lors d'un déploiement