C6217
Aktualisiert: November 2007
C6217
Warnung C6217: Implizite Umwandlung zwischen semantisch unterschiedlichen Integer-Typen: HRESULT wird mit "not" getestet. Verwenden Sie stattdessen das Makro SUCCEEDED oder FAILED.
Diese Warnung gibt an, dass ein HRESULT mit dem not-Operator (!) getestet wird. Ein Erfolgswert (S_OK) im HRESULT wird durch den Wert 0 (null) angezeigt. Bei einem booleschen Typ weist 0 (null) jedoch auf einen Fehler hin. Das Testen eines HRESULT mit dem not-Operator (!) 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 not-Operators 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.