종료 코드 기록 및 모범 사례

종료 코드 기록 및 모범 사례

Autodesk 설치 및 제거를 처리할 때 중복된 오류 코드가 많이 발견되었습니다. 예를 들어

3010ERROR_SUCCESS_REBOOT_REQUIRED

-2147021886ERROR_SUCCESS_REBOOT_REQUIRED

그리고

1618년ERROR_INSTALL_ALREADY_RUNNING

-2147023278ERROR_INSTALL_ALREADY_RUNNING

궁금합니다. 둘 중 하나가 "최신" 접근 방식인가요, 아니면 Microso0ft가 항상 병렬적이고 중복된 종료 코드를 가지고 있었나요? 두 경우 모두 선호되는 접근 방식은 무엇입니까? 나는 나만의 설치 프로그램을 만들기 시작했고, 그런 것이 있다면 올바른 순서를 사용하고 있는지 확인하고 싶습니다. 모범 사례가 없으면 로그가 짧을수록 양수가 더 좋다고 생각합니다.

답변1

Windows 사용자 모드에서는 오류 코드가 주로 두 가지 형태로 사용됩니다. 하나는HRESULT그리고 또 하나는Win32 오류 코드. HRESULT는 일반적으로 다음에서 사용됩니다.COM 프로그래밍HEX 값으로 표시됩니다. 메서드는 성공 후 (0)을 반환하고 S_OK, 실패하면 음수를 반환합니다(0x8로 시작). Win32 오류 코드는 0에서 65535( ) 사이의 정수입니다 2^16 - 1. 둘 다 WinError.hWindows 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

관련 정보