退出代碼歷史記錄和最佳實踐

退出代碼歷史記錄和最佳實踐

在處理 Autodesk 安裝和卸載時,我發現了一堆重複的錯誤代碼。例如

3010ERROR_SUCCESS_REBOOT_REQUIRED

-2147021886ERROR_SUCCESS_REBOOT_REQUIRED

1618ERROR_INSTALL_ALREADY_RUNNING

-2147023278ERROR_INSTALL_ALREADY_RUNNING

我很好奇,其中之一是「較新」的方法,還是 Microso0ft 總是有並行和冗餘的退出程式碼?在這兩種情況下,哪一種方法是首選方法?我開始建立自己的安裝程序,如果有這樣的事情,我想確保我使用正確的順序。如果沒有最佳實踐,我覺得日誌越短,正數越好。

答案1

在Windows使用者模式下,錯誤代碼主要有兩種形式。一是H結果另一個是Win32 錯誤代碼。 HRESULT一般用於COM程式設計並表示為十六進制值。方法S_OK成功後返回(零),失敗時返回負值(從 0x8 開始)。 Win32 錯誤代碼是 0 到 65535 ( ) 之間的整數2^16 - 1。兩者可以WinError.h透過 Windows SDK 頭檔中指定的一些巨集相互轉換。以下是範例:

#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)

對於上面的例子,轉換將是這樣的:

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

這兩個錯誤代碼都在WinError.h頭文件中定義。如果您正在進行一些 COM 編程,那麼請使用 HRESULT(安裝程式經常使用 COM)。如果您使用的是 Win32 API,則使用 Win32 錯誤代碼(由 GetLastError 傳回)。兩種錯誤代碼格式都可以傳遞以FormatMessage()獲取等效的錯誤訊息(就像strerror()在 Linux 世界中一樣)。

延伸閱讀:

答案2

我想說這些錯誤退出程式碼對分別代表相同的錯誤:

$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

相關內容