Funzione MsiGetLastErrorRecord (msiquery.h)

La funzione MsiGetLastErrorRecord restituisce il record di errore restituito per l'ultimo processo chiamante. Questa funzione restituisce un handle che deve essere chiuso usando MsiCloseHandle.

Sintassi

MSIHANDLE MsiGetLastErrorRecord();

Valore restituito

Handle per il record di errore. Se l'ultima funzione ha esito positivo, MsiGetLastErrorRecord restituisce un valore MSIHANDLE null.

Commenti

Con la funzione MsiGetLastErrorRecord , il campo 1 del record contiene il codice di errore del programma di installazione. Altri campi contengono dati specifici per l'errore specifico. Il record di errore viene rilasciato internamente dopo l'esecuzione di questa funzione.

Se il record viene passato a MsiProcessMessage, viene formattato cercando la stringa nel database corrente. Se non è presente alcuna sessione di installazione ma è aperto un database del prodotto, la stringa di formato può essere ottenuta da una query nella tabella Error usando il codice di errore, seguita da una chiamata a MsiFormatRecord. Se il codice di errore è noto, i parametri possono essere interpretati singolarmente.

Le funzioni seguenti impostano il record di errore per processo o lo reimpostano su Null se non si è verificato alcun errore. MsiGetLastErrorRecord cancella anche il record di errore dopo averlo restituito.

Si noti che è consigliabile usare variabili di tipo PMSIHANDLE perché il programma di installazione chiude gli oggetti PMSIHANDLE quando escono dall'ambito, mentre è necessario chiudere gli oggetti MSIHANDLE chiamando MsiCloseHandle. Per altre informazioni, vedere Usare PMSIHANDLE anziché la sezione HANDLE in Procedure consigliate per Windows Installer.

Nell'esempio seguente viene usata una chiamata a MsiDatabaseOpenView per mostrare come ottenere informazioni estese sull'errore da una delle funzioni di Windows Installer che supporta MsiGetLastErrorRecord. L'esempio OpenViewOnDatabase tenta di aprire una vista in un handle di database. L'handle hDatabase può essere ottenuto da una chiamata a MsiOpenDatabase. Se l'apertura della vista ha esito negativo, la funzione tenta di ottenere informazioni estese sull'errore usando MsiGetLastErrorRecord.

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

Requisiti

Requisito Valore
Client minimo supportato Windows Installer 5.0 in Windows Server 2012, Windows 8, Windows Server 2008 R2 o Windows 7. Windows Installer 4.0 o Windows Installer 4.5 in Windows Server 2008 o Windows Vista. Windows Installer in Windows Server 2003 o Windows XP
Piattaforma di destinazione Windows
Intestazione msiquery.h
Libreria Msi.lib
DLL Msi.dll

Vedi anche

Funzioni di accesso allo stato del programma di installazione