SUCCEEDED и S_FAILED
От: Burz  
Дата: 17.06.04 13:38
Оценка:
Я чего-то недогоняю.

есть переменная типа HRESULT у которой значение = S_FAILED
и идет проверка: if( SUCCEEDED(hr) )
Так выполнение продолжается внутри этого ифа. Это глюк?
Re: SUCCEEDED и S_FAILED
От: Кодт Россия  
Дата: 17.06.04 13:46
Оценка: 2 (2)
Здравствуйте, Burz, Вы писали:

B>есть переменная типа HRESULT у которой значение = S_FAILED

B>и идет проверка: if( SUCCEEDED(hr) )
B>Так выполнение продолжается внутри этого ифа. Это глюк?

Что это за константа S_FAILED ?

Есть S_FALSE, что означает "успешно, но результат отрицательный" (сравни с S_OK).
Есть E_FAIL, что означает "ошибка, что-то не получилось".
И ещё дофига разных успешных и ошибочных значений. Ошибочных, как правило, больше.

Конвенция наименования кодов говорит, что S_xxx и yyy_S_xxx — это коды успеха, а E_xxx и yyy_E_xxx — коды ошибок.

Макросы SUCCEEDED() / FAILED() проверяют, является ли результат "успешным" или "провальным".
Этому соответствует 0 или 1 (соответственно) в 31-м бите — флаг SEVERITY.
Перекуём баги на фичи!
Re: SUCCEEDED и S_FAILED
От: .Mistery Беларусь  
Дата: 17.06.04 13:47
Оценка: 3 (2)
Здравствуйте, Burz, Вы писали:

B>Я чего-то недогоняю.


B>есть переменная типа HRESULT у которой значение = S_FAILED

B>и идет проверка: if( SUCCEEDED(hr) )
B>Так выполнение продолжается внутри этого ифа. Это глюк?

Ну вопервых ты ошибся и наверное не S_FAILED а S_FALSE!

Так и должно быть!

winerror.h
//
// Success codes
//
#define S_OK                                   ((HRESULT)0x00000000L)
#define S_FALSE                                ((HRESULT)0x00000001L)


S_ — означает Success, E_ — это ERROR, тоесть общий код ошибки E_FAIL

Вот пример некоторых кодов HRESULT
S_OK - Функция отработала успешно. В некоторых случаях этот код также означает, что функция возвращает логическую истину. Значение S_OK равно 0

NOERROR - То же, что S_OK

S_FALSE - Функция отработала успешно и возвращает логическую ложь. Значение S_FALSE равно 1

E_UNEXPECTED - Неожиданная ошибка

E_NOIMPL - Метод не реализован

E_NOINTERFACE - Компонент не поддерживает запрашиваемый интерфейс. Возвращается QueryInterface

E_OUTOFMEMORY - Компонент не может выделить требуемый объем памяти

E_FAIL - Ошибка по неуказанной причине


Удачи!
... << RSDN@Home 1.1.3 beta 1 >>
Мы — маньяки, должны помогать друг другу!
Re: SUCCEEDED и S_FAILED
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 17.06.04 13:49
Оценка: 1 (1)
Здравствуйте, Burz, Вы писали:

B>есть переменная типа HRESULT у которой значение = S_FAILED

B>и идет проверка: if( SUCCEEDED(hr) )
B>Так выполнение продолжается внутри этого ифа. Это глюк?

все правильно, S_ и означает, что SUCCEEDED, просто есть возможность сделать разные успехи
Re[2]: SUCCEEDED и S_FAILED
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 18.06.04 12:08
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Burz, Вы писали:


B>>есть переменная типа HRESULT у которой значение = S_FAILED

B>>и идет проверка: if( SUCCEEDED(hr) )
B>>Так выполнение продолжается внутри этого ифа. Это глюк?

К>Что это за константа S_FAILED ?


К>Есть S_FALSE, что означает "успешно, но результат отрицательный" (сравни с S_OK).

К>Есть E_FAIL, что означает "ошибка, что-то не получилось".
К>И ещё дофига разных успешных и ошибочных значений. Ошибочных, как правило, больше.

К>Конвенция наименования кодов говорит, что S_xxx и yyy_S_xxx — это коды успеха, а E_xxx и yyy_E_xxx — коды ошибок.


К>Макросы SUCCEEDED() / FAILED() проверяют, является ли результат "успешным" или "провальным".

К>Этому соответствует 0 или 1 (соответственно) в 31-м бите — флаг SEVERITY.

Или то, что HRESULT соответственно больше/меньше 0 когда приводишь к long, но сие тривиально
HgLab: Mercurial Server and Repository Management for Windows
Re[3]: SUCCEEDED и S_FAILED
От: Кодт Россия  
Дата: 18.06.04 12:11
Оценка:
Здравствуйте, Нахлобуч, Вы писали:

К>>Макросы SUCCEEDED() / FAILED() проверяют, является ли результат "успешным" или "провальным".

К>>Этому соответствует 0 или 1 (соответственно) в 31-м бите — флаг SEVERITY.

Н>Или то, что HRESULT соответственно больше/меньше 0 когда приводишь к long, но сие тривиально


больше-или-равен 0. S_OK==0...
Перекуём баги на фичи!
Re[4]: SUCCEEDED и S_FAILED
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 18.06.04 13:35
Оценка:
Здравствуйте, Кодт, Вы писали:

К>больше-или-равен 0. S_OK==0...


HgLab: Mercurial Server and Repository Management for Windows
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.