MsiGetLastErrorRecord 関数 (msiquery.h)
MsiGetLastErrorRecord 関数は、呼び出し元のプロセスで最後に返されたエラー レコードを返します。 この関数は、 MsiCloseHandle を使用して閉じる必要があるハンドルを返します。
構文
MSIHANDLE MsiGetLastErrorRecord();
戻り値
エラー レコードへのハンドル。 最後の関数が成功した場合、 MsiGetLastErrorRecord は NULL MSIHANDLE を返します。
注釈
MsiGetLastErrorRecord 関数を使用すると、レコードのフィールド 1 にインストーラー エラー コードが含まれます。 その他のフィールドには、特定のエラーに固有のデータが含まれています。 エラー レコードは、この関数の実行後に内部的に解放されます。
レコードが MsiProcessMessage に渡される場合は、現在のデータベース内の文字列を検索して書式設定されます。 インストール セッションがないが、製品データベースが開いている場合、エラー コードを使用して Error テーブル のクエリで書式指定文字列を取得し、その後 に MsiFormatRecord を呼び出す可能性があります。 エラー コードがわかっている場合は、パラメーターを個別に解釈できます。
次の関数は、プロセスごとのエラー レコードを設定するか、エラーが発生しなかった場合は null にリセットします。 MsiGetLastErrorRecord は、 エラー レコードを返した後もクリアします。
- MsiOpenDatabase
- MsiDatabaseCommit
- MsiDatabaseOpenView
- MsiDatabaseImport
- MsiDatabaseExport
- MsiDatabaseMerge
- MsiDatabaseGenerateTransform
- MsiDatabaseApplyTransform
- MsiViewExecute
- MsiViewModify
- MsiRecordSetStream
- MsiGetSummaryInformation
- MsiGetSourcePath
- MsiGetTargetPath
- MsiSetTargetPath
- MsiGetComponentState
- MsiSetComponentState
- MsiGetFeatureState
- MsiSetFeatureState
- MsiGetFeatureCost
- MsiGetFeatureValidStates
- MsiSetInstallLevel
次の例では、 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 |