Как использовать проверку состояния HRESULT в C ++ - PullRequest
1 голос
/ 02 февраля 2020
HRESULT hr = S_OK; //initialization`
if (int i == 5)
{
    hr = 1; //Is it correct usage?  
}
if (hr == 1)
    cout<<"The value of i is 5";

Как я всегда слышал, HRESULT выводится в таких строках, как E_TIMEOUT et c. правильно ли использовать число, которое я использовал.

Ответы [ 2 ]

2 голосов
/ 02 февраля 2020

HRESULT 0 или S_OK является стандартным кодом "успеха". Принимая во внимание, что 1 - это S_FALSE, что означает «успех, но я не совсем сделал то, что вы просили, потому что, вероятно, это уже сделано».

Стандартный шаблон - что-то ближе к этому:

HRESULT hr = S_OK //initialization


if (int i == 5)
{
    hr = S_OK;    
}
else
{
    hr = E_INVALIDARG;  // Or any E_ error code
}

if (SUCCEEDED(hr))
{
    cout<<"The value of i is 5";
}
else if (hr == E_INVALIDARG)
{
    // handle specific error
}
else
{
   // handle all other errors generically
}
0 голосов
/ 04 февраля 2020

Основной вопрос здесь заключается в том, для чего вы используете HRESULT для?

Вы можете явно присвоить любое значение HRESULT, но тогда почему бы просто не использовать int?

HRESULT s используются как способ сообщить об успешном или неудачном вызове функции. Обычно HRESULT это либо S_OK (0), либо ошибка (отрицательные числа). S_FALSE (-1) используется реже.

При использовании с COM или. NET вызывающая сторона обычно только проверяет, успешно ли выполнена функция. По умолчанию при маршалинге функции, которая возвращает маршаллер HRESULT. NET, функция будет превращена в void, вызывая исключение, если результат отрицательный, и отбрасывая результат, если он неотрицательный.

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

...