C6214

aviso C6214: cast entre tipos inteiros semanticamente diferentes: HRESULT para um tipo booliana

Esse aviso indica que um está HRESULT sendo lançado em um tipo booliana. O valor de êxito (S_OK) de um HRESULT é igual a 0. No entanto, 0 indica falha para um tipo booliana. A seleção de HRESULT um em um tipo booliana e, em seguida, o uso dele em uma expressão de teste produzirá um resultado incorreto. Às vezes, esse aviso ocorrerá se um HRESULT estiver sendo armazenado em uma variável booliana. Qualquer comparação que usa a variável booliana para testar se HRESULT há êxito ou falha pode levar a resultados incorretos.

Exemplo

O código a seguir gera este aviso:

#include <windows.h>

BOOL f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;
  hr = CoGetMalloc(1, &pMalloc);
  if ((BOOL)hr) // warning C6214
  {
    // success code ...
    return TRUE;
  }
  else
  {
    // failure code ...
    return FALSE;
  }
}

Para corrigir esse aviso, use o seguinte código:

#include <windows.h>

BOOL f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;

  hr = CoGetMalloc(1, &pMalloc);
  if (SUCCEEDED(hr))
  {
    // success code ...
    return TRUE;
  }
  else
  {
    // failure code ...
    return FALSE;
  }
}

Para esse aviso, o SCODE tipo é equivalente a HRESULT.

Normalmente, a SUCCEEDED macro ou FAILED deve ser usada para testar o valor de um HRESULT.

Para obter mais informações, consulte um dos tópicos a seguir.

CONSEGUIU

FALHOU

Para aproveitar a metodologia de alocação de memória C++ moderna, use os mecanismos fornecidos pela STL (Biblioteca de Modelos Padrão) do C++. Isso inclui shared_ptr, unique_ptr e vetor. Para obter mais informações, consulte Smart Pointers e Biblioteca Padrão C++.