Введение

Тип данных компьютерного программирования HRESULT — это тип данных, представляющий статус завершения функции. Он используется в исходном коде приложений, предназначенных для Microsoft Windows и более ранних операционных систем IBM/Microsoft OS/2, однако его конструкция не ограничивает его использование этими средами; он может применяться в любой системе, поддерживающей 32-битные целые числа. Изначальной целью HRESULT было определение диапазонов кодов состояния для публичного и внутреннего использования Microsoft, чтобы избежать конфликтов между кодами состояния в различных подсистемах операционной системы OS/2. HRESULT спроектирован таким образом, чтобы одновременно являться простым числовым значением и структурой, содержащей поля, указывающие на степень серьезности, категорию и код статуса. HRESULT наиболее часто используется в программировании COM, где он служит основой для стандартизированного механизма обработки ошибок, но его применение не ограничивается COM. Например, он может использоваться как альтернатива более традиционному булевому результату "успех/неудача".

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 превратился в простое число. Но название сохранилось".