退出代码历史和最佳实践

退出代码历史和最佳实践

在处理 Autodesk 安装和卸载时,我发现一堆重复的错误代码。例如

3010错误成功_需要重新启动

-2147021886错误成功_需要重新启动

1618错误_安装_已准备好_正在运行

-2147023278错误_安装_已准备好_正在运行

我很好奇,这两种方法是否是“较新”的方法,还是微软一直都有并行且冗余的退出代码?而且,这两种方法是否是首选方法?我开始构建自己的安装程序,如果有这样的情况,我想确保我使用的是正确的顺序。如果没有最佳实践,我觉得正数更适合缩短日志。

答案1

在 Windows 用户模式下,错误代码主要以两种形式使用。一种是错误结果另一个是Win32 错误代码. HRESULT 通常用于COM 编程并以十六进制值表示。方法S_OK成功时返回(零),失败时返回负数(以 0x8 开头)。Win32 错误代码是 0 到 65535 之间的整数(2^16 - 1)。两者可以通过 Windows SDK 中头文件中指定的一些宏相互转换WinError.h。以下是示例:

#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

相关内容