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

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

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

он пишет —

Наконец, API WIC использует 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 чтобы программа была надежной и устойчивой?

1

Решение

Я не уверен насчет макросов Кенни, однако полагаю, что вам абсолютно необходимо знать следующее: для кодов ошибок установлен самый значимый бит, и все значение становится отрицательным. «Стандартные» макросы 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); }

или же

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

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

5

Другие решения

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

0

По вопросам рекламы [email protected]