HRESULT RaiseError(ERRORINFO &info, CComVariant &var, BSTR bstrSQLState) { CComPtr<IErrorInfo> spErrorInfo; GetErrorInfo(0, &spErrorInfo); // 에러 객체가 없으면 생성한다. // 에러 객체는 MDAC SDK가 제공한다. if(spErrorInfo==NULL) spErrorInfo.CoCreateInstance(CLSID_EXTENDEDERRORINFO, NULL, CLSCTX_INPROC_SERVER); // 추가할 에러 DISPPARAMS dispparams = { NULL, NULL, 0, 0 }; if(V_VT(&var)!=VT_EMPTY) { dispparams.rgvarg = &var; dispparams.cArgs = 1; } CComPtr<IUnknown> spSQLInfo; if(bstrSQLState) { CComPolyObject<CCUBRIDErrorInfo> *pObj; CComPolyObject<CCUBRIDErrorInfo>::CreateInstance(NULL, &pObj); CCUBRIDErrorInfo *pSQLInfo = &(pObj->m_contained); pSQLInfo->m_bstrSQLState = bstrSQLState; pSQLInfo->m_lNativeError = info.dwMinor; pSQLInfo->QueryInterface(__uuidof(IUnknown), (void **)&spSQLInfo); } // IErrorRecords의 포인터를 구해서 에러를 추가한다. CComPtr<IErrorRecords> spErrorRecords; spErrorInfo->QueryInterface(__uuidof(IErrorRecords), (void **)&spErrorRecords); spErrorRecords->AddErrorRecord(&info, info.dwMinor, &dispparams, spSQLInfo, 0); // 에러 객체 등록 SetErrorInfo(0, spErrorInfo); return info.hrError; }