在处理 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