Я читал руководство разработчика MSDN для COM. Однако код на этой страницы сбивает с толку. Воспроизведение здесь:
В следующем примере кода показан рекомендуемый способ обработки неизвестных ошибок:
HRESULT hr;
hr = xxMethod();
switch (GetScode(hr))
{
case NOERROR:
// Method returned success.
break;
case x1:
// Handle error x1 here.
break;
case x2:
// Handle error x2 here.
break;
case E_UNEXPECTED:
default:
// Handle unexpected errors here.
break;
}
Функция GetScode
не определена, как и NOERROR
, и поиск в MSDN не помог. Поиск в Интернете показал, что GetScode
- это макрос, который преобразует HRESULT в SCODE, однако оба они являются 32-битными целыми числами, поэтому я не уверен, для чего он нужен.
Было высказано предположение, что это исторический артефакт, который ничего не делает в 32-битных системах, но в 16-битных системах преобразует hr
в 16-битное целое число. Однако, если это правда, то я не вижу, как будет соответствовать E_UNEXPECTED
, поскольку это 0x8000FFFF
. Кроме того, неясно, предназначены ли x1
и x2
значения 0x800.....
или какая-то усеченная версия.
Наконец, этот код рассматривает все значения успеха, кроме одного, как ошибки. На других страницах того же руководства MSDN говорится, что SUCCEEDED(hr)
или FAILED(hr)
следует использовать для определения успеха или неудачи.
Итак, является ли этот пример кода действительно «рекомендуемым способом» или это какая-то ошибка в документации?