C6217

avviso C6217: Cast implicito tra tipi integer semanticamente diversi: test di HRESULT con 'not' in corso.Considerare viceversa l'utilizzo della macro SUCCEEDED or FAILED.

L'avviso indica che un tipo HRESULT è sottoposto a test con l'operatore not (!).L'esito positivo (S_OK) in HRESULT viene indicato da un valore 0.0 indica tuttavia un errore per un tipo boolean.Il test di HRESULT con l'operatore not (!) per determinare il blocco di codice da eseguire può indurre a seguire un percorso di codice non correttoe provocare risultati indesiderati.

Esempio

Il codice riportato di seguito genera l'avviso perché viene utilizzato l'operatore not per determinare l'esito positivo o negativo di un valore HRESULT.In questo caso, il percorso di codice non corretto viene eseguito perché ( !hr ) determina l'esecuzione del codice erroneo:

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

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

Per correggere questo avviso, il codice seguente utilizza la macro FAILED per ricercare l'errore:

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

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

Ai fini del presente avviso, il tipo SCODE equivale a HRESULT.

Il valore che in genere indica l'esito positivo di HRESULT (S_OK) è false quando viene testato come valore booleano.

Per verificare se HRESULT ha esito positivo, utilizzare la macro SUCCEEDED.