Existe un nivel más allá de "Microsoft lo dijo". El número de error que genera es un entero de 32 bits porque es parte de la especificación COM para pasar errores entre componentes. Todos los métodos públicos de un componente son en realidad funciones que devuelven HRESULT como valor de retorno; si tiene una función VB, mapea secretamente el valor de retorno de la función a un parámetro [out]. el valor de HRESULT es un campo de bits compuesto por una gran cantidad de valores, pero para mantener las cosas simples, puede dividirlo en dos porciones de 16 bits. Los 16 bits más bajos contienen el número de error real, que está entre 0 y 65535, el rango de 16 bits sin signo. Hay muchos estándares para los 16 bits superiores. El más importante es 0x0000. Todas las constantes que usan esto comienzan con "S_" (significa éxito). El valor de 32 bits más utilizado es S_OK (0x00000000). Si se devuelve este valor, entonces la función ha tenido éxito. La mayoría de sus llamadas al método VB devolverá este valor. Sin embargo, cualquier valor cuyo bit superior esté configurado indica que ha habido un error. En hexadecimal, estos son valores que parecen 0x8___. Hay muchas clases de error. El que VB devuelve por defecto es 0x800A.Sin embargo, la especificación COM solo le ofrece una clase que puede usar oficialmente, 0x8004, que se representa en VB como la constante vbObjectError.
De hecho, VB recomienda usar la constante vbObjectError al generar errores en los métodos públicos en archivos DLL o EXEs de ActiveX. Si lo haces o no hace ninguna diferencia. Simplemente significa que el error que recibe el código de llamada es muy grande y negativo, por lo que debe AND su número de error con & H0000FFFF. Curiosamente, también recomienda que no haga haciendo esto con los métodos de control ActiveX, por alguna razón. Aún más interesante, VB sí mismo ANDs todos los números de error con 0x800A0000 cuando los elevas por defecto, y también detecta si un número de error contiene 0x800A_ _ - y si es así, quita los 16 bits superiores para ti, de todos modos, solo tratas con el número de error en sí. En mi lugar de trabajo, el estándar es ignorar vbObjectError para aprovechar este comportamiento.
Me pregunto si alguien ha tenido todos los problemas al no usar vbObjectError. Ciertamente no tenemos
Es como el póker, levantas por 65536 y vb6 te sube por 5 –