C6221
Actualización: noviembre 2007
C6221
Advertencia C6221: Conversión implícita entre tipos enteros semánticamente diferentes: comparando HRESULT con un entero. Considere utilizar en su lugar la macro SUCCEEDED o FAILED.
Esta advertencia indica que un tipo HRESULT se está comparando con un entero distinto de cero. El valor 0 representa el éxito en HRESULT (S_OK). Por consiguiente, la conversión implícita de un HRESULT a un entero generará un valor incorrecto y, con toda probabilidad, dará lugar a un resultado incorrecto. Con frecuencia la causa es que se espera que una función devuelva un entero cuando, en realidad, devuelve un HRESULT.
Ejemplo
El código siguiente genera esta advertencia, al comparar HRESULT con un valor entero:
#include <windows.h>
HRESULT f( )
{
HRESULT hr;
LPMALLOC pMalloc;
hr = CoGetMalloc(1, &pMalloc);
if (hr == 4)
{
// failure code ...
return S_FALSE;
}
else
{
// success code ...
return S_OK;
}
}
Para corregir esta advertencia, el código siguiente utiliza la macro FAILED:
#include <windows.h>
HRESULT f( )
{
HRESULT hr;
LPMALLOC pMalloc;
hr = CoGetMalloc(1, &pMalloc);
if (FAILED(hr))
{
// failure code ...
return S_FALSE;
}
else
{
// success code ...
return S_OK;
}
}
Para esta advertencia, el tipo SCODE es equivalente a HRESULT.