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 Installer 函数之一获取扩展错误信息。 示例 OpenViewOnDatabase 尝试打开数据库句柄上的视图。 可以通过调用 MsiOpenDatabase 来获取 hDatabase 句柄。 如果打开视图失败,函数会尝试使用 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 |
Library | Msi.lib |
DLL | Msi.dll |