В статьях 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 HRESULT
s? Как правильно использовать HRESULT
s чтобы программа была надежной и устойчивой?
Я не уверен насчет макросов Кенни, однако полагаю, что вам абсолютно необходимо знать следующее: для кодов ошибок установлен самый значимый бит, и все значение становится отрицательным. «Стандартные» макросы 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 HRESULT
s вы можете использовать это вспомогательное приложение в системном трее.
Эта статья MSDN от Кенни может помочь другим понять возможные подходы к обработке ошибок, включая создание исключений: MSDN — C ++ и Windows API июль 2012