Freigeben über


Fehlerbehandlung in benutzerdefinierten Aktionen

Windows Installer verwaltet die meisten Fehlerbehandlungen bei der Bereitstellung automatisch. Benutzerdefinierte Aktionen können hingegen zum Fehlschlagen des Installationsprogramms führen. Alle benutzerdefinierten Aktionen enthalten Code. Bei Code ist die Fehlerbehandlung immer ein wesentlicher Teil des Prozesses. Wenn eine benutzerdefinierte Aktion z. B. Code enthält, der eine Datei öffnet, und diese Datei nicht vorhanden ist, muss ein Fehlerhandler den Fehler an Windows Installer zurückmelden, damit die Installation rückgängig gemacht werden kann.

Tipp

Bei benutzerdefinierten Aktionen, die in JScript oder VBScript geschrieben sind, wird weder der Fehler an Windows Installer gemeldet noch kann die Installation rückgängig gemacht werden. Dem Benutzer kann ein Fehlerdialogfeld angezeigt werden. Benutzerdefinierte Aktionen, die von großer Bedeutung für eine Installation sind, müssen in Visual Basic, Visual C# oder Visual C++ geschrieben sein, damit der Fehler an Windows Installer übergeben werden kann.

Abfangen des Fehlers

Für die Behandlung eines Fehlers in einer benutzerdefinierten Aktion müssen Sie Code hinzufügen, der den Fehler abfängt und die Informationen an Windows Installer zurückgibt. In den folgenden Beispielen wird veranschaulicht, wie ein Fehler in Visual Basic, Visual C#, Visual C++, JScript und VBScript-Code verarbeitet wird:

' 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;
}

Siehe auch

Weitere Ressourcen

Verwalten von benutzerdefinierten Aktionen bei der Bereitstellung