Как преобразовать Win32 HRESULT в int возвращаемое значение? - PullRequest
1 голос
/ 02 августа 2009

Я пишу консольное приложение Windows на C ++ и хотел бы вернуть ноль в случае успеха и значимый код ошибки при ошибке (т. Е. S_OK должен возвращать 0, а E_OUTOFMEMORY должен возвращать значение, отличное от E_FAIL и т. Д.). Является ли следующий подход подходящим?

int wmain(int argc, wchar_t *argv[])
{
    HRESULT hr = DoSomething();
    return (int) hr;
}

Или есть лучший способ? Может быть, стандартная функция Win32 API или макрос, который я забыл или не смог найти?

Ответы [ 4 ]

7 голосов
/ 02 августа 2009

ОП хочет, чтобы возвращаемое значение ноль указывало на успех. Есть коды успеха, которые не равны нулю и так ...

if ( SUCCEEDED( hr ) )
    return 0;
return hr;
4 голосов
/ 02 августа 2009

HRESULT это просто 32-разрядное целое число, каждый код имеет свое значение, поэтому то, что вы делаете, это то, что вы хотите .

3 голосов
/ 02 августа 2009

Существует неявное преобразование, поэтому приведение не требуется.

(Скорее, к сожалению, существует также неявное преобразование в bool и в typedef типа Win32 BOOL, поэтому S_OK преобразуется в false, а все другие значения (включая ошибки) преобразуются в true - общий источник ошибок в программах COM.)

2 голосов
/ 02 августа 2009

«Лучший способ» - использовать приведение в стиле C ++:

HRESULT hr = DoSomething();
return static_cast<int>(hr);

В противном случае, как сказал Стив , это просто целое число. Он определяется как long, а не int, но вместо приведения от HRESULT к long до int вы, очевидно, можете просто сделать это за один маневр.

(То есть windows.h предполагает, что long будет 32-разрядным целым числом, что не гарантируется стандартом C & C ++. Но я полагаю, что так и происходит).


Еще лучше то, что для этого вообще не требуется приведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...