⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 handleresult.cpp

📁 本书分为五个部分
💻 CPP
字号:

#include "stdafx.h"
#include "HandleResult.h"


////////////////////////////////////////////////////////////////////////
// 函数: HandleResult
//
// 这个函数主要对返回码进行处理. 它根据对错误的支持程序, 进行不同的处理.
//
////////////////////////////////////////////////////////////////////////
HRESULT HandleResult(HRESULT           hrReturned,
					 LPCWSTR           pwszFile,
					 ULONG             ulLine)
{
	HRESULT           hr;
	IErrorInfo *      pIErrorInfo      = NULL;
	IErrorRecords *   pIErrorRecords   = NULL;
	ULONG             cRecords;
	ULONG             iErr;

	// 如果提供的返回码是错误码.
	if( FAILED(hrReturned) )
	{
		// 通过使用自动化函数GetErrorInfo来获取自动化错误接口IErrorInfo.
		hr = GetErrorInfo(0, &pIErrorInfo);

		// 成功获取错误对象中的IErrorInfo接口指针.
		if( SUCCEEDED(hr) && pIErrorInfo )
		{
			// OLE DB对自动化错误模式进行了扩展, 允许错误对象支持
			// IErIErrorRecords接口, 而这个接口可输出多个错误记录.
			hr = pIErrorInfo->QueryInterface(IID_IErrorRecords,
				(void**)&pIErrorRecords);
			if( SUCCEEDED(hr) )
			{
				// 获取错误对象的记录数.
				CHECK_HR(hr = pIErrorRecords->GetRecordCount(&cRecords));

				// 在错误记录集中循环, 显示每个记录信息.
				for( iErr = 0; iErr < cRecords; iErr++ )
				{
					DisplayErrorRecord(hrReturned, iErr, pIErrorRecords,
						pwszFile, ulLine);
				}
			}
			// 如果错误对象不支持IErrorRecords接口, 
			// 则显示错误的基本信息(由IErrorInfo提供).
			else
			{
				DisplayErrorInfo(hrReturned, pIErrorInfo, pwszFile, ulLine);
			}
		}
		// 如果没有错误对象(不支持IErrorInfo接口), 则显示返回码(HRESULT)..
		else
		{
			wprintf(L"\nNo Error Info posted; HResult: 0x%08x\n"
				L"File: %s, Line: %d\n", hrReturned, pwszFile, ulLine);
		}
	}

CLEANUP:
	if( pIErrorInfo )
		pIErrorInfo->Release();
	if( pIErrorRecords )
		pIErrorRecords->Release();
	return hrReturned;
}

////////////////////////////////////////////////////////////////////////
// 函数: DisplayErrorRecord
//
// 这个函数显示从IErrorRecords接口获取的单个错误记录信息.
// 也包括从ISQLErrorInfo接口获取的信息(如果支持).
//
////////////////////////////////////////////////////////////////////////
HRESULT DisplayErrorRecord(HRESULT           hrReturned,
						   ULONG             iRecord,
						   IErrorRecords *   pIErrorRecords,
						   LPCWSTR           pwszFile,
						   ULONG             ulLine)
{
	HRESULT           hr;
	IErrorInfo *      pIErrorInfo       = NULL;
	BSTR              bstrDescription   = NULL;
	BSTR              bstrSource        = NULL;
	BSTR              bstrSQLInfo       = NULL;

	static LCID       lcid              = GetUserDefaultLCID();

	LONG              lNativeError      = 0;
	ERRORINFO         ErrorInfo;

	// 获取错误记录的IErrorInfo接口指针.
	CHECK_HR(hr = pIErrorRecords->GetErrorInfo(iRecord, lcid, &pIErrorInfo));
	
	// 获取这个错误的描述.
	CHECK_HR(hr = pIErrorInfo->GetDescription(&bstrDescription));

	// 获取这个错误的源(产生错误的对象).
	CHECK_HR(hr = pIErrorInfo->GetSource(&bstrSource));

	// 获取这个错误记录的基本信息.
	CHECK_HR(hr = pIErrorRecords->GetBasicErrorInfo(iRecord, &ErrorInfo));

	// 如果错误对象支持ISQLErrorInfo, 则获取相关信息.
	GetSqlErrorInfo(iRecord, pIErrorRecords, &bstrSQLInfo, &lNativeError);

	// 显示错误信息.
	if( bstrSQLInfo )	// 如果支持ISQLErrorInfo.
	{
		wprintf(L"\nErrorRecord:  HResult: 0x%08x\nDescription: %s\n"
			L"SQLErrorInfo: %s\nSource: %s\nFile: %s, Line: %d\n",
			ErrorInfo.hrError,
			bstrDescription,
			bstrSQLInfo,
			bstrSource,
			pwszFile,
			ulLine);
	}
	else				// 如果不支持ISQLErrorInfo.
	{
		wprintf(L"\nErrorRecord:  HResult: 0x%08x\nDescription: %s\n"
			L"Source: %s\nFile: %s, Line: %d\n",
			ErrorInfo.hrError,
			bstrDescription,
			bstrSource,
			pwszFile,
			ulLine);
	}

CLEANUP:
	if( pIErrorInfo ) pIErrorInfo->Release();
	SysFreeString(bstrDescription);
	SysFreeString(bstrSource);
	SysFreeString(bstrSQLInfo);
	return hr;
}


////////////////////////////////////////////////////////////////////////
// 函数: DisplayErrorInfo
//
// 这个函数显示错误对象的基本错误信息(不支持IErrorRecords时使用).
//
////////////////////////////////////////////////////////////////////////
HRESULT DisplayErrorInfo(HRESULT        hrReturned,
						 IErrorInfo *   pIErrorInfo,
						 LPCWSTR        pwszFile,
						 ULONG          ulLine)
{
	HRESULT        hr;
	BSTR           bstrDescription   = NULL;
	BSTR           bstrSource        = NULL;

	// 获取错误的描述.
	CHECK_HR(hr = pIErrorInfo->GetDescription(&bstrDescription));

	// 获取这个错误的源(产生错误的对象). -- This will be the window title.
	CHECK_HR(hr = pIErrorInfo->GetSource(&bstrSource));

	// 显示错误信息.
	wprintf(L"\nErrorInfo:  HResult: 0x%08x, Description: %s\nSource: %s\n" 
		L"File: %s, Line: %d\n",
		hrReturned,
		bstrDescription,
		bstrSource,
		pwszFile,
		ulLine);

CLEANUP:
	SysFreeString(bstrDescription);
	SysFreeString(bstrSource);
	return hr;
}

////////////////////////////////////////////////////////////////////////
// GetSqlErrorInfo
//
// If the error object supports ISQLErrorInfo, get the SQL error
// string and native error code for this error.
//
////////////////////////////////////////////////////////////////////////
HRESULT GetSqlErrorInfo(ULONG             iRecord,
						IErrorRecords *   pIErrorRecords,
						BSTR *            pBstr,
						LONG *            plNativeError)
{
	HRESULT           hr;
	ISQLErrorInfo *   pISQLErrorInfo   = NULL;
	LONG              lNativeError     = 0;

	// Attempt to get the ISQLErrorInfo interface for this error
	// record through GetCustomErrorObject. Note that ISQLErrorInfo
	// is not mandatory, so failure is acceptable here.
	// See ISQLErrorInfo
	CHECK_HR(hr = pIErrorRecords->GetCustomErrorObject(
		iRecord,                               // iRecord
		IID_ISQLErrorInfo,                     // riid
		(IUnknown**)&pISQLErrorInfo            // ppISQLErrorInfo
		));

	// If we obtained the ISQLErrorInfo interface, get the SQL
	// error string and native error code for this error.
	if( pISQLErrorInfo )
		hr = pISQLErrorInfo->GetSQLInfo(pBstr, &lNativeError);

CLEANUP:
	if( plNativeError )
		*plNativeError = lNativeError;
	if( pISQLErrorInfo )
		pISQLErrorInfo->Release();
	return hr;
}

/////////////////////////////////////////////////////////////////
// myCreateSession
//
// Create an OLE DB session object from the given data source
// object. The IDBCreateSession interface is mandatory, so this
// is a simple operation.
//
/////////////////////////////////////////////////////////////////
HRESULT   myCreateSession
   (
   IUnknown *           pUnkDataSource,
   IUnknown **          ppUnkSession
   )
{
   HRESULT              hr;
   IDBCreateSession *   pIDBCreateSession = NULL;
   
   //Create a session object from a data source object.
   XCHECK_HR(hr = pUnkDataSource->QueryInterface(
             IID_IDBCreateSession, (void**)&pIDBCreateSession));
   XCHECK_HR(hr = pIDBCreateSession->CreateSession(
             NULL,               // pUnkOuter
             IID_IOpenRowset,    // riid
             ppUnkSession ));    // ppSession
            
CLEANUP:
   if( pIDBCreateSession )
      pIDBCreateSession->Release();
   return hr;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -