Fungsi MsiGetLastErrorRecord (msiquery.h)

Fungsi MsiGetLastErrorRecord mengembalikan rekaman kesalahan yang terakhir dikembalikan untuk proses panggilan. Fungsi ini mengembalikan handel yang harus ditutup menggunakan MsiCloseHandle.

Sintaks

MSIHANDLE MsiGetLastErrorRecord();

Mengembalikan nilai

Handel ke rekaman kesalahan. Jika fungsi terakhir berhasil, MsiGetLastErrorRecord mengembalikan MSIHANDLE null.

Keterangan

Dengan fungsi MsiGetLastErrorRecord , bidang 1 dari rekaman berisi kode kesalahan penginstal. Bidang lain berisi data khusus untuk kesalahan tertentu. Rekaman kesalahan dirilis secara internal setelah fungsi ini dijalankan.

Jika rekaman diteruskan ke MsiProcessMessage, rekaman diformat dengan mencari string dalam database saat ini. Jika tidak ada sesi penginstalan tetapi database produk terbuka, string format dapat diperoleh oleh kueri pada tabel Kesalahan menggunakan kode kesalahan, diikuti dengan panggilan ke MsiFormatRecord. Jika kode kesalahan diketahui, parameter dapat ditafsirkan secara individual.

Fungsi berikut mengatur catatan kesalahan per proses atau mengatur ulang ke null jika tidak ada kesalahan yang terjadi. MsiGetLastErrorRecord juga menghapus catatan kesalahan setelah mengembalikannya.

Perhatikan bahwa disarankan untuk menggunakan variabel jenis PMSIHANDLE karena alat penginstal menutup objek PMSIHANDLE saat keluar dari cakupan, sedangkan Anda harus menutup objek MSIHANDLE dengan memanggil MsiCloseHandle. Untuk informasi selengkapnya lihat Menggunakan PMSIHANDLE alih-alih bagian HANDLE di Praktik Terbaik Penginstal Windows.

Sampel berikut menggunakan panggilan ke MsiDatabaseOpenView untuk menunjukkan cara mendapatkan informasi kesalahan yang diperluas dari salah satu fungsi Pemasang Windows yang mendukung MsiGetLastErrorRecord. Contohnya, OpenViewOnDatabase, mencoba membuka tampilan pada handel database. Handel hDatabase dapat diperoleh dengan panggilan ke MsiOpenDatabase. Jika membuka tampilan gagal, fungsi kemudian mencoba mendapatkan informasi kesalahan yang diperluas dengan menggunakan 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;
}

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows Installer 5.0 di Windows Server 2012, Windows 8, Windows Server 2008 R2 atau Windows 7. Windows Installer 4.0 atau Windows Installer 4.5 di Windows Server 2008 atau Windows Vista. Pemasang Windows pada Windows Server 2003 atau Windows XP
Target Platform Windows
Header msiquery.h
Pustaka Msi.lib
DLL Msi.dll

Lihat juga

Fungsi Akses Status Alat Penginstal