Função MsiGetLastErrorRecord (msiquery.h)

A função MsiGetLastErrorRecord retorna o registro de erro retornado pela última vez para o processo de chamada. Essa função retorna um identificador que deve ser fechado usando MsiCloseHandle.

Sintaxe

MSIHANDLE MsiGetLastErrorRecord();

Retornar valor

Um identificador para o registro de erro. Se a última função tiver sido bem-sucedida, MsiGetLastErrorRecord retornará um MSIHANDLE nulo.

Comentários

Com a função MsiGetLastErrorRecord , o campo 1 do registro contém o código de erro do instalador. Outros campos contêm dados específicos para o erro específico. O registro de erro é liberado internamente depois que essa função é executada.

Se o registro for passado para MsiProcessMessage, ele será formatado pesquisando a cadeia de caracteres no banco de dados atual. Se não houver nenhuma sessão de instalação, mas um banco de dados de produto estiver aberto, a cadeia de caracteres de formato poderá ser obtida por uma consulta na tabela Error usando o código de erro, seguida por uma chamada para MsiFormatRecord. Se o código de erro for conhecido, os parâmetros poderão ser interpretados individualmente.

As funções a seguir definem o registro de erro por processo ou o redefinem como nulo se nenhum erro ocorreu. MsiGetLastErrorRecord também limpa o registro de erro depois de retorná-lo.

Observe que é recomendável usar variáveis do tipo PMSIHANDLE porque o instalador fecha objetos PMSIHANDLE à medida que eles saem do escopo, enquanto você deve fechar objetos MSIHANDLE chamando MsiCloseHandle. Para obter mais informações, confira a seção Use PMSIHANDLE em vez de HANDLE nas Melhores práticas do Windows Installer.

O exemplo a seguir usa uma chamada para MsiDatabaseOpenView para mostrar como obter informações de erro estendidas de uma das funções do Windows Installer que dá suporte a MsiGetLastErrorRecord. O exemplo, OpenViewOnDatabase, tenta abrir uma exibição em um identificador de banco de dados. O identificador hDatabase pode ser obtido por uma chamada para MsiOpenDatabase. Se a abertura da exibição falhar, a função tentará obter informações de erro estendidas 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;
}

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows Installer 5.0 no Windows Server 2012, no Windows 8, no Windows Server 2008 R2 ou no Windows 7. Windows Installer 4.0 ou Windows Installer 4.5 no Windows Server 2008 ou no Windows Vista. Windows Installer no Windows Server 2003 ou no Windows XP
Plataforma de Destino Windows
Cabeçalho msiquery.h
Biblioteca Msi.lib
DLL Msi.dll

Confira também

Funções de acesso ao estado do instalador