次の方法で共有


MsiGetLastErrorRecord 関数 (msiquery.h)

MsiGetLastErrorRecord 関数は、呼び出し元のプロセスで最後に返されたエラー レコードを返します。 この関数は、 MsiCloseHandle を使用して閉じる必要があるハンドルを返します。

構文

MSIHANDLE MsiGetLastErrorRecord();

戻り値

エラー レコードへのハンドル。 最後の関数が成功した場合、 MsiGetLastErrorRecord は NULL MSIHANDLE を返します。

注釈

MsiGetLastErrorRecord 関数を使用すると、レコードのフィールド 1 にインストーラー エラー コードが含まれます。 その他のフィールドには、特定のエラーに固有のデータが含まれています。 エラー レコードは、この関数の実行後に内部的に解放されます。

レコードが MsiProcessMessage に渡される場合は、現在のデータベース内の文字列を検索して書式設定されます。 インストール セッションがないが、製品データベースが開いている場合、エラー コードを使用して Error テーブル のクエリで書式指定文字列を取得し、その後 に MsiFormatRecord を呼び出す可能性があります。 エラー コードがわかっている場合は、パラメーターを個別に解釈できます。

次の関数は、プロセスごとのエラー レコードを設定するか、エラーが発生しなかった場合は null にリセットします。 MsiGetLastErrorRecord は、 エラー レコードを返した後もクリアします。

PMSIHANDLE 型の変数は、インストーラーがスコープ外に出ると PMSIHANDLE オブジェクトを閉じるのに対し、 MsiCloseHandle を呼び出して MSIHANDLE オブジェクトを閉じる必要があるため、PMSIHANDLE 型の変数を使用することをお勧めします。 詳細については、「Windows インストーラーのベスト プラクティス」の「HANDLE の代わりに PMSIHANDLE を使用する」セクションを参照してください。

次の例では、 MsiDatabaseOpenView の呼び出しを使用して、 MsiGetLastErrorRecord をサポートする Windows インストーラー関数の 1 つから拡張エラー情報を取得する方法を示します。 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 インストーラー 5.0。 Windows Server 2008 または Windows Vista の Windows インストーラー 4.0 または Windows インストーラー 4.5。 Windows Server 2003 または Windows XP の Windows インストーラー
対象プラットフォーム Windows
ヘッダー msiquery.h
Library Msi.lib
[DLL] Msi.dll

こちらもご覧ください

インストーラーの状態アクセス関数