Структура кодов ошибок COM

На следующем рисунке показан формат HRESULT (или SCODE); числа указывают на битовые позиции:

Shows the format of an 'H RESULT' or 'S CODE' with numbers indicating bit positions.

Бит высокого порядка в HRESULT или SCODE указывает, представляет ли возвращаемое значение успешно или неудачно. Если задано значение 0, SEVERITY_SUCCESS значение указывает на успешность. Если задано значение 1, SEVERITY_ERROR, это означает сбой.

Биты R, C, N и R зарезервированы.

Поле объекта указывает системную службу, ответственную за ошибку. Корпорация Майкрософт выделяет новые коды объектов по мере необходимости. Большинство значений SCODEs и HRESULT задают для поля объекта FACILITY_ITF, указывая на ошибку метода интерфейса.

Общие поля объекта описаны в следующей таблице.

Поле объекта Значение Описание
FACILITY_DISPATCH
2
Для ошибок интерфейса IDispatch с поздними привязками.
FACILITY_ITF
4
Для большинства кодов состояния, возвращаемых из методов интерфейса. Фактическое значение ошибки определяется интерфейсом. То есть два HRESULT с одинаковым 32-разрядным значением, возвращаемым из двух разных интерфейсов, могут иметь разные значения.
FACILITY_NULL
0
Для широко применимых общих кодов состояния, таких как S_OK.
FACILITY_RPC
1
Для кодов состояния, возвращаемых из удаленных вызовов процедур.
FACILITY_STORAGE
3
Для кодов состояния, возвращаемых из вызовов метода IStorage или IStream , связанных со структурированным хранилищем. Коды состояния, код которых (более низкие 16 бит) находится в диапазоне кодов ошибок MS-DOS (то есть менее 256) имеют то же значение, что и соответствующая ошибка MS-DOS.
FACILITY_WIN32
7
Используется для предоставления средства обработки кодов ошибок из функций в API Windows в качестве HRESULT. Коды ошибок в 16-разрядной версии OLE, которые дублировали системные коды ошибок, также были изменены на FACILITY_WIN32.
FACILITY_WINDOWS
8
Используется для дополнительных кодов ошибок из интерфейсов, определенных корпорацией Майкрософт.

Поле кода — это уникальное число, назначенное для представления ошибки или предупреждения.

По соглашению значения HRESULT обычно имеют имена в следующем формате: Facility_Severity_Reason.

Объект — это имя объекта или другой отличительный идентификатор; Серьезность — это одна буква, S или E, указывающая, успешно ли выполнен вызов функции (S) или произошла ошибка (E); и причина — это идентификатор, описывающий значение кода. Например, код состояния STG_E_FILENOTFOUND указывает на ошибку, связанную с хранилищем; в частности, запрошенный файл не существует. Коды состояния из FACILITY_NULL пропускают префикс Facility_.

Коды ошибок определяются в контексте реализации интерфейса. После определения коды успешности нельзя изменить или добавить новые коды успешности. Однако можно записать новые коды сбоев. Корпорация Майкрософт оставляет за собой право определять новые коды сбоев (но не коды успешного выполнения) для интерфейсов, описанных в FACILITY_ITF или новых средствах.

Обработка ошибок в COM

протоколы Windows: HRESULT