Exit-Code-Verlauf und Best Practice

Exit-Code-Verlauf und Best Practice

Ich finde eine Reihe doppelter Fehlercodes bei der Installation und Deinstallation von Autodesk. Zum Beispiel

3010FEHLER_ERFOLG_NEUES STARTEN_ERFORDERLICH

-2147021886FEHLER_ERFOLG_NEUES STARTEN_ERFORDERLICH

Und

1618FEHLER_INSTALLATION_LÄUFT_BEREITS

-2147023278FEHLER_INSTALLATION_LÄUFT_BEREITS

Ich bin neugierig, ist das eine oder das andere der „neuere“ Ansatz oder hatte Microsoft schon immer parallele und redundante Exit-Codes? Und ist in beiden Fällen das eine oder das andere der bevorzugte Ansatz? Ich fange gerade an, meine eigenen Installationsprogramme zu erstellen, und ich möchte sicher sein, dass ich die richtige Reihenfolge verwende, falls es so etwas gibt. Wenn es keine bewährte Methode gibt, sind positive Zahlen meiner Meinung nach besser, da die Protokolle kürzer sind.

Antwort1

Im Windows-Benutzermodus werden die Fehlercodes hauptsächlich in zwei Formen verwendet. Eine istHRESULTund ein anderer istWin32-FehlercodesHRESULT wird im Allgemeinen verwendet inCOM-Programmierungund als HEX-Wert angegeben. Methoden geben S_OKbei Erfolg (Null) zurück, bei Misserfolg negativ (beginnend mit 0x8). Win32-Fehlercodes sind Ganzzahlen zwischen 0 und 65535 ( 2^16 - 1). Beide können mit einigen Makros, die in der Header-Datei im Windows SDK angegeben sind, ineinander umgewandelt werden WinError.h. Hier sind die Beispiele:

#define FACILITY_WIN32 7

#define __HRESULT_FROM_WIN32(x) \
((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000)))

#define HRESULT_CODE(hr) ((hr) & 0xFFFF)

Für das obige Beispiel sieht die Konvertierung folgendermaßen aus:

-2147021886 = 0x80070BC2 = (0x80070BC2 & 0xFFFF) = 0xBC2 = 3010
-2147023278 = 0x80070625 = (0x80070625 & 0xFFFF) = 0x652 = 1618

Beide Fehlercodes sind in WinError.hder Header-Datei definiert. Wenn Sie COM-Programmierung durchführen, verwenden Sie HRESULT (das Installationsprogramm verwendet häufig COM). Wenn Sie Win32-APIs verwenden, verwenden Sie Win32-Fehlercodes (zurückgegeben von GetLastError). Beide Fehlercodeformate können übergeben werden, FormatMessage()um eine gleichwertige Fehlermeldung zu erhalten (wie strerror()in der Linux-Welt).

Weiterführende Literatur:

Antwort2

Ich würde sagen, dass diese Paare von Fehler-Exit-Codes jeweils die gleichen Fehler darstellen:

$errCodes = 3010, -2147021886, 1618, -2147023278

foreach ($errCode in $errCodes) {
    '{0,12} 0x{1:x8}' -f $errCode, $errCode
}
        3010 0x00000bc2
 -2147021886 0x80070bc2
        1618 0x00000652
 -2147023278 0x80070652
foreach ($errCode in $errCodes) {
    '{0,12} 0x{1:x4}' -f $errCode, ($errCode -band 0xFFFF)
}
        3010 0x0bc2
 -2147021886 0x0bc2
        1618 0x0652
 -2147023278 0x0652

verwandte Informationen