COM: как получить более подробную информацию об ошибках COM? - PullRequest
3 голосов
/ 12 июля 2009

Поздравил,

При работе с DirectX вы получаете этот красивый заголовок для #include с именем DxErr9.h, который имеет действительно полезные функции, такие как:

DXGetErrorString9

и

DXGetErrorDescription9

Они рассказывают вам все, что вам нужно знать об ошибке с учетом HR.

Но теперь, работая с COM и OLE, я обнаружил, что сам по себе с HRESULTS, которые возвращаются из функций COM. Это действительно только я и MSDN на данный момент, или в OLE DB есть схожие функции, с которыми я еще не сталкивался?

Ответы [ 2 ]

3 голосов
/ 13 июля 2009

Кроме того, вы должны посмотреть на информацию об ошибке . Частью системы COM является концепция информации об ошибках, которая представляет собой глобальный для каждого потока, который может быть установлен и очищен в разное время. Вы запрашиваете его в ответ на ошибку, и если оно установлено , оно будет иметь более полезную информацию, чем просто просмотр HRESULT.

HRESULT hr=something();
if (FAILED(hr))
{
  CComPtr<IErrorInfo> err;
  ::GetErrorInfo(0, &err);
  if (err)
  {
    CComBSTR description;
    err->GetDescription(&description);

    // description will be a more descriptive error message than just formatting the 
    // HRESULT because it is set by the COM server code at the point of the error
  }
}
1 голос
/ 12 июля 2009

Используйте _com_error, чтобы получить значимую строку:

#include <comdef.h>

HRESULT hr = SomeComFunc();
if ( FAILED(hr) )
{
  _com_error err(hr);
  LPTCSTR szErrMsg = err.ErrorMessage();
  // log szErrMsg or whatever 
}
...