When a consumer wants to retrieve an error object in response to a return code it received, it performs the following steps:
For example, the following code shows how a consumer might retrieve and use an OLE DB error object:
#include <oledb.h>
#include <stdio.h>
IUnknown *pMyObject;
extern GUID IID_IMyInterface;
DWORD MYLOCALEID;
BSTR bstrSourceOfError, bstrDescriptionOfError;
int main() {
IErrorInfo *pErrorInfo;
IErrorInfo *pErrorInfoRec;
IErrorRecords *pErrorRecords;
ISupportErrorInfo *pSupportErrorInfo;
HRESULT hr, hrErr;
ULONG i, ulNumErrorRecs;
ERRORINFO ErrorInfo;
// Error or warning occurs when calling method. (Not shown.)
if (!FAILED(hrErr))
return (hrErr);
// Check that the current interface supports error objects.
hr = pMyObject->QueryInterface(IID_ISupportErrorInfo,
(void**) &pSupportErrorInfo);
if (SUCCEEDED(hr)) {
hr = pSupportErrorInfo->InterfaceSupportsErrorInfo(IID_IMyInterface);
if (hr == S_OK) {
// Get the current error object. Return if no error object exists.
GetErrorInfo(0,&pErrorInfo);
if (!pErrorInfo) return (hrErr);
// Get the IErrorRecord interface and get the count of error recs.
pErrorInfo->QueryInterface(IID_IErrorRecords, (void**) &pErrorRecords);
pErrorRecords->GetRecordCount(&ulNumErrorRecs);
// Read through error records and display them.
for (i = 0; i < ulNumErrorRecs; i++) {
// Get basic error information.
pErrorRecords->GetBasicErrorInfo(i, &ErrorInfo);
// Get error description and source through the IErrorInfo interface
// pointer on a particular record.
pErrorRecords->GetErrorInfo(i, MYLOCALEID, &pErrorInfoRec);
BSTR bstrDescriptionOfError = NULL;
BSTR bstrSourceOfError = NULL;
pErrorInfoRec->GetDescription(&bstrDescriptionOfError);
pErrorInfoRec->GetSource(&bstrSourceOfError);
// At this point, you could call GetCustomErrorObject and query for
// additional interfaces to determine what else happened.
wprintf(
OLESTR("HRESULT: %lx, Minor Code: %lu, Source: %s, Description: %s"),
ErrorInfo.hrError,
ErrorInfo.dwMinor,
bstrSourceOfError,
bstrDescriptionOfError);
// Free the resources.
SysFreeString(bstrDescriptionOfError);
SysFreeString(bstrSourceOfError);
pErrorInfoRec->Release();
}
// Release the error object.
pErrorInfo->Release();
pErrorRecords->Release();
}
}
return (hrErr);
};