Sair do histórico do código e das melhores práticas

Sair do histórico do código e das melhores práticas

Estou encontrando vários códigos de erro duplicados ao lidar com instalações e desinstalações da Autodesk. Por exemplo

3010ERROR_SUCCESS_REBOOT_REQUIRED

-2147021886ERROR_SUCCESS_REBOOT_REQUIRED

e

1618ERROR_INSTALL_ALREADY_RUNNING

-2147023278ERROR_INSTALL_ALREADY_RUNNING

Estou curioso, uma ou outra é a abordagem "mais nova" ou a Microso0ft sempre teve códigos de saída paralelos e redundantes? E em ambos os casos, uma ou outra é a abordagem preferida? Estou começando a construir meus próprios instaladores e quero ter certeza de que estou usando a sequência correta, se houver. Se não houver práticas recomendadas, sinto que os números positivos são melhores porque os registros são mais curtos.

Responder1

No modo de usuário do Windows, os códigos de erro são usados ​​principalmente de duas formas. Um éHRESULTe outro éCódigos de erro Win32. HRESULT é geralmente usado emProgramação COMe indicado como valor HEX. Os métodos retornam S_OK(Zero) após sucesso, negativo em caso de falha (começando com 0x8). Os códigos de erro Win32 são números inteiros entre 0 e 65535 ( 2^16 - 1). Ambos podem ser convertidos entre si com algumas macros especificadas no WinError.harquivo de cabeçalho no Windows SDK. Aqui está a amostra:

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

Para o exemplo acima, a conversão será assim:

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

Ambos os códigos de erro definidos no WinError.harquivo de cabeçalho. Se você estiver fazendo alguma programação COM, use HRESULT (o instalador usa muito COM). Se você estiver usando APIs Win32, use códigos de erro Win32 (retornados por GetLastError). Ambos os formatos de código de erro podem ser passados ​​para FormatMessage()obter mensagens de erro equivalentes (como strerror()no mundo Linux).

Leituras adicionais:

Responder2

Eu diria que esses pares de códigos de saída de erro representam os mesmos erros, respectivamente:

$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

informação relacionada