Какая литеральная константа HRESULT не сможет выполнить макрос SUCCEEDED ()? - PullRequest
3 голосов
/ 08 апреля 2010

Определение УСПЕШНОГО (): #define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)

Справочная информация. Когда в диалоговом окне нажимается кнопка «ОК», мне нужно вернуть значение HRESULT hr, чтобы SUCCEEDED(hr) было истинным. Если нажата кнопка «Отмена», мне нужно вернуть отрицательное значение. Я мог бы использовать bools, но это сломало бы существующий паттерн (обычно значения hr берутся из глубин системных библиотек). Итак, я знаю, что могу вернуть S_OK на Ok, но что мне вернуть на Cancel? Я мог бы просто return (HRESULT)-1;, но должен быть лучший способ - некоторая литеральная константа HRESULT, которая имеет отрицательное значение и представляет общий сбой. S_FALSE не так ли, поскольку его значение определяется как 1L.

Пожалуйста, помогите мне найти правильную константу.

Ответы [ 4 ]

7 голосов
/ 08 апреля 2010

E_FAIL или E_ABORT.Однако, это только поднимает большую проблему, которую вы никогда не должны использовать SUCCEEDED(hr), если вы просто хотите проверить против S_OK.

6 голосов
/ 08 апреля 2010

Возможно E_ABORT

3 голосов
/ 08 апреля 2010

Как сказал Кайл Алонс, , E_ABORT (или E_FAIL) может хорошо работать для вашей цели, или вы можете разработать свой собственный, используя макрос MAKE_HRESULT() или HRESULT_FROM_WIN32(), если есть ошибка Win32 код, соответствующий тому, что вы хотите указать.

Может быть HRESULT_FROM_WIN32( ERROR_CANCELLED)?

3 голосов
/ 08 апреля 2010

Типичные значения показаны здесь: http://msdn.microsoft.com/en-us/library/aa378137(VS.85).aspx

E_FAIL или E_ABORT кажутся наиболее очевидными.

...