MsiGetLastErrorRecord-Funktion (msiquery.h)

Die MsiGetLastErrorRecord-Funktion gibt den Fehlerdatensatz zurück, der zuletzt für den aufrufenden Prozess zurückgegeben wurde. Diese Funktion gibt ein Handle zurück, das mit MsiCloseHandle geschlossen werden soll.

Syntax

MSIHANDLE MsiGetLastErrorRecord();

Rückgabewert

Ein Handle für den Fehlerdatensatz. Wenn die letzte Funktion erfolgreich war, gibt MsiGetLastErrorRecord eine NULL-MSIHANDLE zurück.

Hinweise

Bei der MsiGetLastErrorRecord-Funktion enthält Feld 1 des Datensatzes den Fehlercode des Installationsprogramms. Andere Felder enthalten Daten, die für den jeweiligen Fehler spezifisch sind. Der Fehlerdatensatz wird intern freigegeben, nachdem diese Funktion ausgeführt wurde.

Wenn der Datensatz an MsiProcessMessage übergeben wird, wird er formatiert, indem die Zeichenfolge in der aktuellen Datenbank gesucht wird. Wenn keine Installationssitzung vorhanden ist, aber eine Produktdatenbank geöffnet ist, kann die Formatzeichenfolge durch eine Abfrage in der Fehlertabelle mithilfe des Fehlercodes abgerufen werden, gefolgt von einem Aufruf von MsiFormatRecord. Wenn der Fehlercode bekannt ist, können die Parameter einzeln interpretiert werden.

Die folgenden Funktionen legen den Fehlerdatensatz pro Prozess fest, oder setzen ihn auf NULL zurück, wenn kein Fehler aufgetreten ist. MsiGetLastErrorRecord löscht auch den Fehlerdatensatz, nachdem er zurückgegeben wurde.

Beachten Sie, dass die Verwendung von Variablen vom Typ PMSIHANDLE empfohlen wird, da das Installationsprogramm PMSIHANDLE-Objekte schließt, wenn sie den Gültigkeitsbereich sprengen, während Sie MSIHANDLE-Objekte durch Aufrufen von MsiCloseHandle schließen müssen. Weitere Informationen finden Sie im Abschnitt Verwenden von PMSIHANDLE anstelle von HANDLE im Abschnitt Bewährte Methoden für Windows Installer.

Im folgenden Beispiel wird ein Aufruf von MsiDatabaseOpenView verwendet, um zu zeigen, wie Erweiterte Fehlerinformationen von einer der Windows Installer-Funktionen abgerufen werden, die MsiGetLastErrorRecord unterstützt. Im Beispiel OpenViewOnDatabase wird versucht, eine Ansicht für ein Datenbankhandle zu öffnen. Das hDatabase-Handle kann durch einen Aufruf von MsiOpenDatabase abgerufen werden. Wenn das Öffnen der Ansicht fehlschlägt, versucht die Funktion dann, erweiterte Fehlerinformationen mithilfe von MsiGetLastErrorRecord abzurufen.

#include <windows.h>
#include <Msiquery.h>
#pragma comment(lib, "msi.lib")
//-------------------------------------------------------------------
// Function: OpenViewOnDatabase
//
// Arguments: hDatabase - handle to a MSI package obtained
//                                        via a call to MsiOpenDatabase
//
// Returns: UINT status code. ERROR_SUCCESS for success.
//--------------------------------------------------------------------------------------------------
UINT __stdcall OpenViewOnDatabase(MSIHANDLE hDatabase)
{
    if (!hDatabase)
        return ERROR_INVALID_PARAMETER;

    PMSIHANDLE hView = 0;
    UINT uiReturn = MsiDatabaseOpenView(hDatabase, 
                                TEXT("SELECT * FROM `UnknownTable`"),
                           &hView);

    if (ERROR_SUCCESS != uiReturn)
    {
        // try to obtain extended error information.

        PMSIHANDLE hLastErrorRec = MsiGetLastErrorRecord();

        TCHAR* szExtendedError = NULL;
        DWORD cchExtendedError = 0;
        if (hLastErrorRec)
        {
            // Since we are not currently calling MsiFormatRecord during an
            // install session, hInstall is NULL. If MsiFormatRecord was called
            // via a DLL custom action, the hInstall handle provided to the DLL
            // custom action entry point could be used to further resolve 
            // properties that might be contained within the error record.
            
            // To determine the size of the buffer required for the text,
            // szResultBuf must be provided as an empty string with
            // *pcchResultBuf set to 0.

            UINT uiStatus = MsiFormatRecord(NULL,
                             hLastErrorRec,
                             TEXT(""),
                             &cchExtendedError);

            if (ERROR_MORE_DATA == uiStatus)
            {
                // returned size does not include null terminator.
                cchExtendedError++;

                szExtendedError = new TCHAR[cchExtendedError];
                if (szExtendedError)
                {
                    uiStatus = MsiFormatRecord(NULL,
                                     hLastErrorRec,
                                     szExtendedError,
                                     &cchExtendedError);
                    if (ERROR_SUCCESS == uiStatus)
                    {
                        // We now have an extended error
                        // message to report.

                        // PLACE ADDITIONAL CODE HERE
                        // TO LOG THE ERROR MESSAGE
                        // IN szExtendedError.
                    }

                    delete [] szExtendedError;
                    szExtendedError = NULL;
                }
            }
        }
    }

    return uiReturn;
}

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows Installer 5.0 unter Windows Server 2012, Windows 8, Windows Server 2008 R2 oder Windows 7. Windows Installer 4.0 oder Windows Installer 4.5 unter Windows Server 2008 oder Windows Vista. Windows Installer unter Windows Server 2003 oder Windows XP
Zielplattform Windows
Kopfzeile msiquery.h
Bibliothek Msi.lib
DLL Msi.dll

Weitere Informationen

Installerstatuszugriffsfunktionen