Шаг 258.
Среда программирования Visual C++.
Ошибки СОМ-компонентов. Класс _com_error

    На этом шаге мы рассмотрим класс _com_error.

    В Visual C++ есть класс _com_error, инкапсулирующий код HRESULT и скрывающий детали работы с ним. В этом классе определены функции, возвращающие информацию о соответствующей ошибке. Самые важные приведены в таблице 1:

Таблица 1. Важные функции-члены класса _com_error
Функция-член Возвращаемое значение
Error Код HRESULT, на основе создан объект _com_error
ErrorInfo Указатель на объект IErrorInfo (описан ниже) или NULL, если объект IErrorInfo не существует. Завершив работу с объектом IErrorInfo следует вызвать его функцию Release()
Wcode Значение HRESULT минус 0х80040200, если используется FACILITY_ITF. В противном случае функция возвращает нуль
ErrorMessage Указатель типа TCHAR на системное сообщение, описывающее ошибку. Если такое сообщение отсутствует, возвращается строка "Unknown error", за которой следует шестнадцатеричный код HRESULT

    Если инкапсулированный HRESULT связан с объектом IErrorInfo, то объект _com_error получает доступ к информации об ошибке. Например, функции-члены HelpFile() и HelpContext() могут обратиться к объекту IErrorInfo и вернуть информацию об ошибке, которая затем отображается средствами справки Windows Help.

    Так как объект _com_error представляет причину исключения его часто передают в блок catch. Рассмотрим пример, в котором таким образом перехватываются ошибки с кодом E_OUTOFMEMORY:

#include <comdef.h> 
#include <stdio.h>

void main() 
{
  try
  {
    _com_error e(E_OUTOFMEMORY); //Создание объекта 
    throw(e); //Вызов исключения
  } 
  catch(_com_error& e)
  {
    printf("Error = %081x\n", e.Error());  
    printf("WCode = %04x\n",   e.WCode());
    printf("Meaning = %s\n\n",   e.ErrorMessage());
  }
}

    Результат работы этой программы таков:

  Error = 8007000e 
  WCode = 0000
  Meaning  =  Not enough storage is available to complete this operation.

    На следующем шаге мы рассмотрим доступ из приложений к кодам HRESULT.




Предыдущий шаг Содержание Следующий шаг