Обработка HRESULT в приложении Direct2D

В статьях журнала msdn Кенни Керра об изображениях и Direct2D он часто использует макрос HR().

В своей статье о компоненте Windows Imaging — http://msdn.microsoft.com/en-gb/magazine/cc500647.aspx

он написал -

Наконец, WIC API использует HRESULT для описания ошибок. В примерах в этой статье используется макрос HR, чтобы четко определить, где методы возвращают HRESULT, который необходимо проверить. Вы можете заменить это своей собственной стратегией обработки ошибок — будь то создание исключения или возврат HRESULT самостоятельно.

HR(decoder.CoCreateInstance(CLSID_WICTiffDecoder));

Однако Кенни не показывает своего определения HR(). Я новичок в C++ и пытаюсь обнаружить и понять детали кода. Я хотел бы знать, какова его реализация HR(), чтобы я мог подумать, как лучше всего обрабатывать HRESULT в моей программе. Я пытался найти определение, но не нашел исходного кода для этих конкретных статей.

Изучая macros, я наткнулся на более свежие документы, в которых предлагается использовать функции inline вместо макросов:

http://msdn.microsoft.com/en-us/library/vstudio/ttsbh614.aspx

http://msdn.microsoft.com/en-us/library/vstudio/z8y1yy88.aspx

Кто-нибудь может сказать мне, как Кенни определяет свой макрос HR()? И что он на самом деле делает?

Как моя программа Direct2D должна обрабатывать HRESULTs? Как правильно использовать HRESULTs, чтобы программа была надежной и отказоустойчивой?


person Duncan Gravill    schedule 20.11.2012    source источник


Ответы (2)


Я не уверен в макросах Кенни, однако я полагаю, что вам абсолютно необходимо знать следующее: коды ошибок имеют установленный старший бит и делают все значение отрицательным. "Стандартные" макросы SUCCEEDED и FAILED тестируют код именно для этого.

HRESULT nValue = ...
if(SUCCEEDED(nValue)) {
  // Not Error
} 

Тогда для краткости и удобочитаемости кода вам понадобится макрос, который делает обе вещи вместе: проверяет успех/неудача и либо возвращает при ошибке, либо выдает исключение. Я полагаю, что рассматриваемый макрос HR делает одно из двух.

Если вы собираетесь использовать ATL, уже есть предопределенные макросы такого типа: ATLENSURE_SUCCEEDED, ATLENSURE_THROW и т. д. Однако Microsoft решила не документировать их (я не знаю ссылку на MSDN, чтобы предоставить здесь).

Ваш HR может быть примерно таким (в зависимости от желаемого действия - бросить или выйти при ошибке):

inline VOID HR(HRESULT nValue) { if(FAILED(nValue)) AtlThrow(nValue); }

or

#define HR(x) { HRESULT nValue = (x); if(FAILED(nValue)) return nValue; }

Кроме того, для удобного декодирования WIC и D2D HRESULT вы можете использовать это вспомогательное приложение на панели задач.

person Roman R.    schedule 20.11.2012

Эта статья MSDN от Кенни может помочь другим понять возможные подходы к обработке ошибок, включая создание исключений: MSDN – C++ и API Windows, июль 2012 г.

person MW_dev    schedule 24.11.2014