MsiGetLastErrorRecord, fonction (msiquery.h)

La fonction MsiGetLastErrorRecord retourne l’enregistrement d’erreur qui a été retourné pour le dernier processus appelant. Cette fonction retourne un handle qui doit être fermé à l’aide de MsiCloseHandle.

Syntaxe

MSIHANDLE MsiGetLastErrorRecord();

Valeur de retour

Handle de l’enregistrement d’erreur. Si la dernière fonction a réussi, MsiGetLastErrorRecord retourne une valeur MSIHANDLE null.

Remarques

Avec la fonction MsiGetLastErrorRecord , le champ 1 de l’enregistrement contient le code d’erreur du programme d’installation. D’autres champs contiennent des données spécifiques à l’erreur particulière. L’enregistrement d’erreur est libéré en interne après l’exécution de cette fonction.

Si l’enregistrement est passé à MsiProcessMessage, il est mis en forme en recherchant la chaîne dans la base de données active. S’il n’existe aucune session d’installation, mais qu’une base de données de produit est ouverte, la chaîne de format peut être obtenue par une requête sur la table Error à l’aide du code d’erreur, suivie d’un appel à MsiFormatRecord. Si le code d’erreur est connu, les paramètres peuvent être interprétés individuellement.

Les fonctions suivantes définissent l’enregistrement d’erreur par processus ou le réinitialisent sur null si aucune erreur ne s’est produite. MsiGetLastErrorRecord efface également l’enregistrement d’erreur après l’avoir retourné.

Notez qu’il est recommandé d’utiliser des variables de type PMSIHANDLE, car le programme d’installation ferme les objets PMSIHANDLE en dehors de leur portée, tandis que vous devez fermer les objets MSIHANDLE en appelant MsiCloseHandle. Pour plus d’informations, consultez la section Utiliser PMSIHANDLE au lieu de HANDLE dans les Bonnes pratiques de Windows Installer.

L’exemple suivant utilise un appel à MsiDatabaseOpenView pour montrer comment obtenir des informations d’erreur étendues à partir de l’une des fonctions Windows Installer qui prend en charge MsiGetLastErrorRecord. L’exemple OpenViewOnDatabase tente d’ouvrir une vue sur un handle de base de données. Le handle hDatabase peut être obtenu par un appel à MsiOpenDatabase. Si l’ouverture de la vue échoue, la fonction tente d’obtenir des informations d’erreur étendues à l’aide de 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;
}

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows Installer 5.0 sur Windows Server 2012, Windows 8, Windows Server 2008 R2 ou Windows 7. Windows Installer 4.0 ou Windows Installer 4.5 sur Windows Server 2008 ou Windows Vista. Windows Installer sur Windows Server 2003 ou Windows XP
Plateforme cible Windows
En-tête msiquery.h
Bibliothèque Msi.lib
DLL Msi.dll

Voir aussi

Fonctions d’accès à l’état du programme d’installation