Función MsiGetLastErrorRecord (msiquery.h)

La función MsiGetLastErrorRecord devuelve el registro de error que se devolvió por última vez para el proceso de llamada. Esta función devuelve un identificador que se debe cerrar mediante MsiCloseHandle.

Sintaxis

MSIHANDLE MsiGetLastErrorRecord();

Valor devuelto

Identificador del registro de errores. Si la última función se realizó correctamente, MsiGetLastErrorRecord devuelve un MSIHANDLE nulo.

Comentarios

Con la función MsiGetLastErrorRecord , el campo 1 del registro contiene el código de error del instalador. Otros campos contienen datos específicos del error concreto. El registro de error se libera internamente después de ejecutar esta función.

Si el registro se pasa a MsiProcessMessage, se le da formato buscando la cadena en la base de datos actual. Si no hay ninguna sesión de instalación, pero hay una base de datos de producto abierta, la cadena de formato se puede obtener mediante una consulta en la tabla Error mediante el código de error, seguida de una llamada a MsiFormatRecord. Si se conoce el código de error, los parámetros se pueden interpretar individualmente.

Las siguientes funciones establecen el registro de error por proceso o lo restablecen en NULL si no se ha producido ningún error. MsiGetLastErrorRecord también borra el registro de error después de devolverlo.

Tenga en cuenta que se recomienda usar variables de tipo PMSIHANDLE porque el instalador cierra los objetos PMSIHANDLE a medida que salen del ámbito, mientras que debe cerrar objetos MSIHANDLE mediante una llamada a MsiCloseHandle. Para más información, consulte la sección Uso de PMSIHANDLE, en lugar de HANDLE en los procedimientos recomendados de Windows Installer.

En el ejemplo siguiente se usa una llamada a MsiDatabaseOpenView para mostrar cómo obtener información de error extendida de una de las funciones de Windows Installer que admite MsiGetLastErrorRecord. El ejemplo, OpenViewOnDatabase, intenta abrir una vista en un identificador de base de datos. El identificador hDatabase se puede obtener mediante una llamada a MsiOpenDatabase. Si se produce un error al abrir la vista, la función intenta obtener información de error extendida mediante 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;
}

Requisitos

Requisito Value
Cliente mínimo compatible Windows Installer 5.0 en Windows Server 2012, Windows 8, Windows Server 2008 R2 o Windows 7. Windows Installer 4.0 o Windows Installer 4.5 en Windows Server 2008 o Windows Vista. Windows Installer en Windows Server 2003 o Windows XP
Plataforma de destino Windows
Encabezado msiquery.h
Library Msi.lib
Archivo DLL Msi.dll

Consulte también

Funciones de acceso de estado del instalador