C6217

Actualización: noviembre 2007

C6217

Advertencia C6217: Conversión implícita entre tipos de enteros semánticamente diferentes: probando HRESULT con 'not'. Considere utilizar en su lugar la macro SUCCEEDED o FAILED.

Esta advertencia indica que HRESULT se está probando con el operador NOT (!). Un valor de 0 en HRESULT indica un éxito (S_OK). Sin embargo, 0 es indicativo de error en los tipos booleanos. Probar HRESULT con el operador NOT (!) para determinar qué bloque de código se debe ejecutar puede producir la siguiente ruta de acceso de código incorrecta. Esto provocará resultados no deseados.

Ejemplo

El código siguiente genera esta advertencia porque el operador NOT se utiliza para determinar el éxito o el error de un valor de HRESULT. En este caso, se ejecuta una ruta de acceso de código incorrecta, porque ( !hr ) ejecuta el código de error:

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

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

Para corregir esta advertencia, el código siguiente utiliza macro la FAILED para buscar el error:

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

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

Para esta advertencia, el tipo SCODE es equivalente a HRESULT.

El valor de éxito típico de HRESULT (S_OK) es false cuando se prueba como tipo booleano.

Para comprobar si HRESULT es un éxito, utilice en su lugar la macro SUCCEEDED.

Vea también

Otros recursos

SUCCEEDED

FAILED