Freigeben über


C6217

Warnung C6217: Implizite Umwandlung zwischen semantisch unterschiedlichen Integer-Typen: HRESULT wird mit "not" getestet.Stattdessen sollten Sie möglicherweise das SUCCEEDED- oder FAILED-Makro verwenden.

Diese Warnung gibt an, dass ein HRESULT mit dem Operator not (!) getestet wird.Ein Erfolg (S_OK) in HRESULT wird mit dem Wert 0 angegeben.0 gibt bei einem booleschen Typ jedoch einen Fehler an.Das Testen eines HRESULT mit dem Operator not (!) zum Bestimmen des auszuführenden Codeblocks kann dazu führen, dass ein ungültiger Codepfad befolgt wird.Dies führt zu unerwünschten Ergebnissen.

Beispiel

Der folgende Code generiert diese Warnung, weil mithilfe des Operators not Erfolg oder Fehlschlag eines HRESULT-Werts bestimmt werden soll.In diesem Fall wird ein ungültiger Codepfad ausgeführt, da ( !hr ) den Fehlercode ausführt:

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

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

Um die Warnung zu korrigieren, verwendet der folgende Code das FAILED -Makro, um den Fehler zu suchen:

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

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

Bei dieser Warnung entspricht der SCODE-Typ HRESULT.

Der typische Erfolgswert von HRESULT (S_OK) ist false, wenn es als boolescher Wert getestet wird.

Verwenden Sie das SUCCEEDED-Makro, um zu überprüfen, ob HRESULT erfolgreich ist.