Структура кодов ошибок 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
Для кодов состояния, возвращаемых из вызовов методов I служба хранилища или 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