Когда вы определяете свои собственные коды HRESULT
, рекомендуется использовать FACILITY_ITF
и определять свои коды в этом диапазоне определяемых приложением кодов. Да, коды могут перекрываться между приложениями, но вы также можете предоставить дополнительное описательное сообщение через SetErrorInfo
API и указать поддержку путем реализации ISupportErrorInfo
, если вы реализуете объект / интерфейс COM.
Отрывок из книги COM+ Programming
объясняет это более подробно: Программирование на COM +: практическое руководство с использованием Visual C ++ и ATL (стр. 67).
Проще, чем вы, вы можете использовать свой собственный код объекта, и он может отличаться в разных модулях, поэтому вы можете легко определить, какой модуль является источником проблемы.
Если вы поместите ресурс MESSAGETABLE
в свой двоичный файл, API FormatMessage
сможет разрешать HRESULT и извлекать текст описания для отдельных кодов, как это происходит с обычными кодами ошибок Windows (приложение все равно должно предоставлять дескриптор модуля для API-функция).
См. Также: Создание собственного HRESULT?
O.P. Edit:
От Microsoft Открытая спецификация протокола HRESULT s
2,1 HRESULT
Пространство нумерации HRESULT расширяется поставщиком. Поставщики могут предоставить свои собственные значения для этого поля, если установлен бит C (0x20000000), указывающий, что это код клиента.
C (1 бит) : Заказчик. Этот бит указывает, является ли значение пользовательским или Microsoft. Бит устанавливается для пользовательских значений и сбрасывается для Microsoft. <1>
<1> Раздел 2.1 : Все значения HRESULT , используемые Microsoft, имеют бит C сброшенный.
Это означает, что я могу составить любой HRESULT, который мне нравится, если я установлю бит C . На практике это означает, что я могу любой любой код , который мне нравится, например ::
E_LOGON_FAILURE = 0xA007052E;
Конечно, я не нашел это число случайно.
Сначала я установил старший бит на 1, чтобы указать на ошибку:
0x80000000
Затем я "выбираю" код ошибки, например, 1326 (0x52E hex) :
0x8000052E
Тогда мне нужно выбрать объект. Давайте оооочень, не знаю, семь :
0x8007052E
Наконец, я установил Customer bit , чтобы указать, что это не определенный Microsoft HRESULT:
0xA007052E
И, по совпадению, все до последнего шага - это смелость макроса Microsoft HRESULT_FROM_WIN32
:
Сопоставляет системный код ошибки со значением HRESULT.
HRESULT HRESULT_FROM_WIN32(DWORD x);