Partilhar via


C6217

Aviso C6217: conversão implícita entre tipos inteiros semanticamente diferentes: teste o HRESULT com 'não'.Considere o uso de teve êxito ou FAILED macro em vez disso.

Este aviso indica que uma HRESULT está sendo testado com o não (!) operador.Um sucesso (S_OK) em HRESULT é indicado por um valor de 0.No entanto, 0 indica falha para um tipo booleano.Testes HRESULT com o não operador (!) para determinar qual código pode fazer com que seguindo o caminho de código incorreta bloco para executar.Isso irá levar a resultados indesejados.

Exemplo

O código a seguir gera este aviso porque não é usado para determinar o sucesso ou fracasso de um HRESULT valor.Nesse caso, o caminho errado do código é executado porque ( !hr ) executa o código de falha:

#include <windows.h>
#include <objbase.h>

void f( )
{
  HRESULT hr = CoInitialize(NULL); 
  if (!hr)
  {
    // failure code ...
  }
  else
  {
    // success code ...
  }
}

Para corrigir esse aviso, o código a seguir usa FAILED macro em busca de falha:

#include <windows.h>
#include <objbase.h>

void f( )
{
  HRESULT hr = CoInitialize(NULL);  
  if (FAILED(hr))
  {
    // failure code ...
  }
  else
  {
    // success code ...
  }
}

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

O valor de sucesso típico de HRESULT (S_OK) é false quando ele é testado como um valor booleano.

Para verificar se HRESULT foi bem sucedida, uso o SUCCEEDED macro em vez disso.