void COledbErrors::_Init(HRESULT Hr) { m_lCount = 0; CComPtr<IErrorInfo> spErrorInfo; ::GetErrorInfo(0, &spErrorInfo); if( spErrorInfo == NULL ) { // No error object m_p[0]._Init(Hr, CComBSTR(L"System"), CComBSTR(L"Function failed.")); m_lCount = 1; return; } CComQIPtr<IErrorRecords> spErrorRecs = spErrorInfo; if( spErrorRecs != NULL ) { // Provider supports IErrorRecords ULONG nCount = 0; spErrorRecs->GetRecordCount(&nCount); for( ULONG i = 0; i < nCount; i++ ) { HRESULT Hr; ERRORINFO ErrorInfo; Hr = spErrorRecs->GetBasicErrorInfo(i, &ErrorInfo); if( FAILED(Hr) ) break; CComPtr<IErrorInfo> spErrorInfoRec; Hr = spErrorRecs->GetErrorInfo(i, ::GetUserDefaultLCID(), &spErrorInfoRec); if( FAILED(Hr) ) break; CComBSTR bstrSource; spErrorInfoRec->GetSource(&bstrSource); CComBSTR bstrMsg; spErrorInfoRec->GetDescription(&bstrMsg); m_p[m_lCount]._Init(ErrorInfo.hrError, bstrSource, bstrMsg); m_lCount++; if( m_lCount >= MAX_ERRORS ) break; } } if( m_lCount == 0 ) { // Provider only supports IErrorInfo CComBSTR bstrSource; spErrorInfo->GetSource(&bstrSource); CComBSTR bstrMsg; spErrorInfo->GetDescription(&bstrMsg); m_p[m_lCount]._Init(Hr, bstrSource, bstrMsg); m_lCount++; } }