Arhn - архитектура программирования

Смущен рекомендуемым MSDN способом обработки ошибок в COM

Я читал руководство разработчика 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) следует использовать для определения успеха или неудачи.

Итак, является ли этот пример кода действительно «рекомендуемым способом» или это какая-то ошибка в документации?

18.06.2014

  • Должно быть, это довольно старый документ. GetScode — это макрос, который давно устарел. Раньше это был рекомендуемый способ, но теперь это не так. 18.06.2014

Ответы:


1

Это (довольно) старая вещь. Файл winerror.h в SDK говорит следующее:

////////////////////////////////////
//                                //
//     COM Error Codes            //
//                                //
////////////////////////////////////


//
// The return value of COM functions and methods is an HRESULT.
// This is not a handle to anything, but is merely a 32-bit value
// with several fields encoded in the value. The parts of an
// HRESULT are shown below.
//
// Many of the macros and functions below were orginally defined to
// operate on SCODEs. SCODEs are no longer used. The macros are
// still present for compatibility and easy porting of Win16 code.
// Newly written code should use the HRESULT macros and functions.
//

Я думаю, это довольно ясно. Я бы сначала доверял SDK, а потом документу.

Мы можем видеть, что SCODE последовательно определен как это в WTypesbase.h (в последних SDK, в старых SDK, я думаю, это было в другом файле):

typedef LONG SCODE;

Так что это действительно 32-битная.

18.06.2014

2

Текст правильный; следует опасаться слепого возврата кодов ошибок из внутренних функций, особенно если ваш код использует код объекта, определенный в другом месте системы.

В частности, на функциональном уровне COM-интерфейса вы должны убедиться, что возвращаемые вами коды ошибок значимы для вашего интерфейса, и вы должны переназначить ошибки, возникающие внутри функции для значимых кодов ошибок.

На практике, однако, никто этого не делает, поэтому вы видите странные и недействующие диалоги ошибок, такие как «Непредвиденная ошибка».

18.06.2014
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..