Введение
Тип данных компьютерного программирования HRESULT — это тип данных, представляющий статус завершения функции. Он используется в исходном коде приложений, предназначенных для Microsoft Windows и более ранних операционных систем IBM/Microsoft OS/2, однако его конструкция не ограничивает его использование этими средами; он может применяться в любой системе, поддерживающей 32-битные целые числа. Изначальной целью HRESULT было определение диапазонов кодов состояния для публичного и внутреннего использования Microsoft, чтобы избежать конфликтов между кодами состояния в различных подсистемах операционной системы OS/2. HRESULT спроектирован таким образом, чтобы одновременно являться простым числовым значением и структурой, содержащей поля, указывающие на степень серьезности, категорию и код статуса. HRESULT наиболее часто используется в программировании COM, где он служит основой для стандартизированного механизма обработки ошибок, но его применение не ограничивается COM. Например, он может использоваться как альтернатива более традиционному булевому результату "успех/неудача".
HRESULT is a computer programming data type that represents the completion status of a function. It is used in the source code of applications targeting Microsoft Windows and earlier IBM/Microsoft OS/2 operating systems, but its design does not limit its use to these environments; it can be used in any system supporting 32 bit integers. The original purpose of HRESULT was to lay out ranges of status codes for both public and Microsoft internal use in order to prevent collisions between status codes in different subsystems of the OS/2 operating system. An HRESULT is designed to simultaneously be both a simple numerical value and a structure of fields indicating severity, facility and status code. Use of HRESULT is most commonly encountered in COM programming, where it forms the basis for a standardized error handling mechanism, but its use is not limited to COM. For example, it can be used as an alternative to the more traditional use of a boolean pass/fail result.
IErrorInfo (показать ошибку)
HRESULT был первоначально определён в операционной системе IBM/Microsoft OS/2 как код возврата ошибок общего назначения и впоследствии был принят в Windows NT. Microsoft Visual Basic значительно расширил механизмы отчёта об ошибках HRESULT, связав объект IErrorInfo с HRESULT и сохраняя (указатель на) объект IErrorInfo в локальном хранилище потока. Механизм IErrorInfo позволяет программам связывать широкий спектр информации с конкретной ошибкой HRESULT: класс объекта, вызвавшего ошибку, интерфейс этого объекта, текст ошибки и ссылку на тему справки в справочном файле. Кроме того, получатели ошибки HRESULT могут запрашивать локализованный текст сообщения об ошибке. Впоследствии HRESULT и связанный с ним механизм IErrorInfo стали механизмом отчёта об ошибках по умолчанию в COM. Поддержка механизма IErrorInfo в Windows крайне непоследовательна. Более старые Windows API, как правило, вообще не поддерживают его, возвращая HRESULT без данных IErrorInfo. Более современные подсистемы Windows COM часто предоставляют обширную информацию об ошибках в описании сообщения объекта IErrorInfo. Более продвинутые возможности механизмов ошибок IErrorInfo – ссылки на справку и локализация по запросу – используются редко. В .NET Framework коды ошибок HRESULT/IErrorInfo преобразуются в исключения CLR при переходе от нативного кода к управляемому коду, а исключения CLR преобразуются в коды ошибок HRESULT/IErrorInfo при переходе от управляемого кода к нативному коду COM.
Происхождение названия
Название HRESULT, по-видимому, означает "дескриптор результата", поскольку многие другие типы Windows используют префикс H для обозначения дескриптора. Например, HMODULE — это дескриптор модуля, то есть значение HMODULE указывает на ресурс модуля. Однако значение HRESULT не указывает на ресурс, поэтому это не дескриптор. По словам Раймонда Чена, "в старые времена это действительно был дескриптор объекта, содержащего подробную информацию об ошибке. Команда COM решила, что выгода не оправдывает затраты, поэтому HRESULT превратился в простое число. Но название сохранилось".