MsiGetLastErrorRecord 函数 (msiquery.h)

MsiGetLastErrorRecord 函数返回上次为调用进程返回的错误记录。 此函数返回应使用 MsiCloseHandle 关闭的句柄。

语法

MSIHANDLE MsiGetLastErrorRecord();

返回值

错误记录的句柄。 如果最后一个函数成功, MsiGetLastErrorRecord 将返回 NULL MSIHANDLE

注解

使用 MsiGetLastErrorRecord 函数时,记录的字段 1 包含安装程序错误代码。 其他字段包含特定于特定错误的数据。 运行此函数后,错误记录在内部释放。

如果记录传递到 MsiProcessMessage,则通过查找当前数据库中的字符串来设置该记录的格式。 如果没有安装会话,但产品数据库处于打开状态,则可以通过对 Error 表 的查询使用错误代码获取格式字符串,然后调用 MsiFormatRecord。 如果已知错误代码,则可能会单独解释参数。

以下函数设置每进程错误记录,如果未发生错误,则将其重置为 null。 MsiGetLastErrorRecord 还会在返回错误记录后清除错误记录。

请注意,建议使用 PMSIHANDLE 类型的变量,因为安装程序在 PMSIHANDLE 对象超出范围时会关闭这些对象,而必须通过调用 MsiCloseHandle 关闭 MSIHANDLE 对象。 有关详细信息,请参阅 Windows Installer 最佳做法中的使用 PMSIHANDLE 而非 HANDLE 部分。

以下示例使用对 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

另请参阅

安装程序状态访问函数