Шаг 44 - Обработка ошибок COM - HRESULT

Многие из функций COM имеют этот тип возврата, который представляет из себя 32 битное число. Именно эта величина и является одним из методов возвращения ошибки. Биты этой величины содержат информацию:

31    - наличие ошибки ( 0 нет 1 есть)
30-27 - резерв
26-16 - область ошибки
15    - 0 код ошибки

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

#define FAILED(Status) ((HRESULT)(Status)<0)
#define SUCCEEDED(Status) ((HRESULT)(Status) >= 0)

Пример применения макроса FAILED:

if ( FAILED( hr )) 
{ 
	cout << "Failed to create server instance " << endl;
	return;
}

Получив ошибку нам бы лучше всего ее расшифровать. Для этого есть специальная утилита в VC в меню TOOLS:

44_1.gif (2492 b)

После ее запуска появится диалоговое окно, в которое можно ввести ошибку и посмотреть, что она обозначает.

44_2.gif (2339 b)

Увидев русские буквы я немного опешил. VC вроде нормальный. А чего это пишет не так ? Подумав я решил может и не правильно, но более менее разумно. Основу этой функции составляет функция Win 32 API - FormatMessage(), которая может вернуть информацию об ошибке. Windows у меня русский. Поискав на диске эту фразу я ее нашел. Она в Kernel32.dll.

44_3.gif (7448 b)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.