📄 handleresult.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 + -