C6217
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.