Historial de códigos de salida y mejores prácticas

Historial de códigos de salida y mejores prácticas

Encuentro un montón de códigos de error duplicados al tratar con instalaciones y desinstalaciones de Autodesk. Por ejemplo

3010ERROR_SUCCESS_REBOOT_REQUIRED

-2147021886ERROR_SUCCESS_REBOOT_REQUIRED

y

1618ERROR_INSTALL_ALREADY_RUNNING

-2147023278ERROR_INSTALL_ALREADY_RUNNING

Tengo curiosidad: ¿es uno u otro el enfoque "más nuevo" o Microso0ft siempre ha tenido códigos de salida paralelos y redundantes? Y en cualquier caso, ¿es uno u otro el enfoque preferido? Estoy empezando a crear mis propios instaladores y quiero estar seguro de que estoy usando la secuencia correcta, si existe tal cosa. Si no existe una mejor práctica, creo que los números positivos son mejores para los registros que son más cortos.

Respuesta1

En el modo de usuario de Windows, los códigos de error se utilizan principalmente de dos formas. Uno esHRESULTADOy otro esCódigos de error de Win32. HRESULT se utiliza generalmente enprogramación COMe indicado como valor HEX. Los métodos devuelven S_OK(cero) después del éxito, negativo en caso de error (comenzando con 0x8). Los códigos de error de Win32 son números enteros entre 0 y 65535 ( 2^16 - 1). Ambos se pueden convertir entre sí con algunas macros especificadas en el WinError.harchivo de encabezado del SDK de Windows. Aquí está la muestra:

#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 el ejemplo anterior, la conversión será así:

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

Ambos códigos de error están definidos en el WinError.harchivo de encabezado. Si está programando COM, use HRESULT (el instalador usa COM mucho). Si está utilizando las API de Win32, utilice los códigos de error de Win32 (devueltos por GetLastError). Se pueden pasar ambos formatos de código de error para FormatMessage()obtener un mensaje de error equivalente (como strerror()en el mundo Linux).

Lecturas adicionales:

Respuesta2

Yo diría que esos pares de códigos de salida de error representan los mismos errores, 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

información relacionada