Коды в FACILITY_ITF

HRESULTс такими объектами, как FACILITY_NULL и FACILITY_RPC имеют универсальное значение, так как они определены в одном источнике: Майкрософт. Однако HRESULT в FACILITY_ITF определяется методом функции или интерфейса, из которого они возвращаются. Это означает, что одно и то же 32-разрядное значение в FACILITY_ITF, возвращаемое двумя различными методами интерфейса, может иметь разные значения.

Причина HRESULTв FACILITY_ITF может иметь разные значения в разных интерфейсах заключается в том, что HRESULTs хранятся в эффективном размере типа данных 32 бита. К сожалению, 32 бита недостаточно большой для разработки системы выделения кода ошибки, которая избегает конфликтов кодов, выделенных различными программистами в разных местах (в отличие от обработки идентификаторов интерфейса и CLSID). В результате 32-разрядный HRESULT структурирован таким образом, что корпорация Майкрософт может определить несколько универсальных кодов ошибок, позволяя другим программистам определять новые коды ошибок без страха конфликтов. Соглашение о коде состояния выглядит следующим образом:

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

Все коды COM, определенные FACILITY_ITF, имеют значение кода в диапазоне 0x0000-0x01FF. Хотя в FACILITY_ITF используется любой код, рекомендуется использовать только значения кода в диапазоне 0x0200-0xFFFF. Эта рекомендация сделана в качестве средства снижения путаницы с любыми ошибками, определенными COM.

Также рекомендуется, чтобы разработчики определили новые функции и интерфейсы для возврата кодов ошибок, определенных COM и в средствах, отличных от FACILITY_ITF. В частности, интерфейсы, которые имеют любой шанс удаленного использования RPC в будущем, должны определить FACILITY_RPC кодексы как юридические. E_UNEXPECTED — это конкретный код ошибки, который большинство разработчиков хотят сделать универсально законным.

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