終了コードの履歴とベストプラクティス

終了コードの履歴とベストプラクティス

オートデスクのインストールとアンインストールの際に、重複したエラーコードが多数見つかります。たとえば、

3010ERROR_SUCCESS_再起動が必要

-2147021886ERROR_SUCCESS_再起動が必要

そして

1618ERROR_INSTALL_ALREADY_RUNNING

-2147023278ERROR_INSTALL_ALREADY_RUNNING

どちらかが「新しい」アプローチなのか、それとも Microsoft では常に並列かつ冗長な終了コードを使用しているのか、興味があります。また、どちらの場合も、どちらかが推奨されるアプローチなのでしょうか。私は独自のインストーラーを構築し始めており、正しいシーケンスを使用していることを確認したいと思っています (そのようなシーケンスがある場合)。ベスト プラクティスがない場合は、ログを短くするために正の数の方が良いと思います。

答え1

Windowsユーザーモードでは、エラーコードは主に2つの形式で使用されます。1つはHRESULTそしてもう一つはWin32 エラーコードHRESULTは一般的にCOMプログラミング16 進値として示されます。メソッドは、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

関連情報