MsiGetLastErrorRecord 함수(msiquery.h)

MsiGetLastErrorRecord 함수는 호출 프로세스에 대해 마지막으로 반환된 오류 레코드를 반환합니다. 이 함수는 MsiCloseHandle을 사용하여 닫아야 하는 핸들을 반환합니다.

구문

MSIHANDLE MsiGetLastErrorRecord();

반환 값

오류 레코드에 대한 핸들입니다. 마지막 함수가 성공하면 MsiGetLastErrorRecord 는 null MSIHANDLE을 반환합니다.

설명

MsiGetLastErrorRecord 함수를 사용하면 레코드의 필드 1에 설치 관리자 오류 코드가 포함됩니다. 다른 필드에는 특정 오류와 관련된 데이터가 포함됩니다. 오류 레코드는 이 함수를 실행한 후 내부적으로 해제됩니다.

레코드가 MsiProcessMessage에 전달되면 현재 데이터베이스에서 문자열을 조회하여 형식이 지정됩니다. 설치 세션이 없지만 제품 데이터베이스가 열려 있는 경우 오류 코드를 사용하여 오류 테이블 의 쿼리에서 형식 문자열을 가져온 다음 MsiFormatRecord를 호출할 수 있습니다. 오류 코드가 알려진 경우 매개 변수를 개별적으로 해석할 수 있습니다.

다음 함수는 프로세스별 오류 레코드를 설정하거나 오류가 발생하지 않은 경우 null로 다시 설정합니다. MsiGetLastErrorRecord 도 반환한 후 오류 레코드를 지웁니다.

설치 관리자가 SCOPE 나가는 동안 PMSIHANDLE 개체를 닫고 MsiCloseHandle을 호출하여 MSIHANDLE 개체를 닫아야 하므로 PMSIHANDLE 형식의 변수를 사용하는 것이 좋습니다. 자세한 내용은 Windows Installer 모범 사례HANDLE 대신 PMSIHANDLE 사용 섹션을 참조하세요.

다음 샘플에서는 MsiDatabaseOpenView 호출을 사용하여 MsiGetLastErrorRecord를 지원하는 Windows Installer 함수 중 하나에서 확장된 오류 정보를 가져오는 방법을 보여 줍니다. 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 Server 2012, Windows 8, Windows Server 2008 R2 또는 Windows 7의 Windows Installer 5.0. Windows Server 2008 또는 Windows Vista의 Windows Installer 4.0 또는 Windows Installer 4.5. Windows Server 2003 또는 Windows XP의 Windows Installer
대상 플랫폼 Windows
헤더 msiquery.h
라이브러리 Msi.lib
DLL Msi.dll

추가 정보

설치 관리자 상태 액세스 함수