Поделиться через


Функция MsiGetLastErrorRecord (msiquery.h)

Функция MsiGetLastErrorRecord возвращает запись об ошибке, которая была возвращена в последний раз для вызывающего процесса. Эта функция возвращает дескриптор, который должен быть закрыт с помощью MsiCloseHandle.

Синтаксис

MSIHANDLE MsiGetLastErrorRecord();

Возвращаемое значение

Дескриптор записи об ошибке. Если последняя функция прошла успешно, MsiGetLastErrorRecord возвращает значение NULL MSIHANDLE.

Комментарии

С помощью функции MsiGetLastErrorRecord поле 1 записи содержит код ошибки установщика. Другие поля содержат данные, относящиеся к конкретной ошибке. Запись об ошибке освобождается внутри системы после выполнения этой функции.

Если запись передается в MsiProcessMessage, она форматируется путем поиска строки в текущей базе данных. Если сеанс установки отсутствует, но база данных продукта открыта, строка формата может быть получена запросом к таблице Error с кодом ошибки, а затем вызовом MsiFormatRecord. Если код ошибки известен, параметры могут интерпретироваться по отдельности.

Следующие функции устанавливают запись об ошибке для каждого процесса или сбрасывают ее значение NULL, если ошибка не произошла. MsiGetLastErrorRecord также очищает запись об ошибке после ее возврата.

Обратите внимание, что рекомендуется использовать переменные типа PMSIHANDLE, так как установщик закрывает объекты PMSIHANDLE по мере их выхода из область, тогда как необходимо закрыть объекты MSIHANDLE, вызвав MsiCloseHandle. Дополнительные сведения см. в разделе Использование PMSIHANDLE вместо HANDLE статьи Рекомендации установщика Windows.

В следующем примере используется вызов MsiDatabaseOpenView , чтобы показать, как получить расширенные сведения об ошибках из одной из функций установщика Windows, которая поддерживает MsiGetLastErrorRecord. В примере OpenViewOnDatabase предпринимается попытка открыть представление дескриптора базы данных. Дескриптор hDatabase можно получить путем вызова MsiOpenDatabase. Если открыть представление не удается, функция пытается получить расширенные сведения об ошибке с помощью 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;
}

Требования

Требование Значение
Минимальная версия клиента Установщик Windows 5.0 в Windows Server 2012, Windows 8, Windows Server 2008 R2 или Windows 7. Установщик Windows 4.0 или установщик Windows 4.5 в Windows Server 2008 или Windows Vista. Установщик Windows в Windows Server 2003 или Windows XP
Целевая платформа Windows
Header msiquery.h
Библиотека Msi.lib
DLL Msi.dll

См. также раздел

Функции доступа к состоянию установщика