C6217
Aviso C6217: Conversão implícita entre tipos inteiros semanticamente diferentes: Testando o HRESULT com 'não'. Considere o uso de SUCCEEDED ou Falha 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, o 0 indica falha para um tipo booleano. Testes HRESULT com o não operador (!) para determinar qual código bloquear a execução pode causar seguindo o caminho de código errada. Isso irá causar 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 para procurar a 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 é um sucesso, use o SUCCEEDED macro em vez disso.