Freigeben über


DLLs de VB6 que no trabajan en x64

Tiene usted una biblioteca que le ha servido por años y que está escrita en el viejo VB6?

Se ha visto enfrentado a tener que usarla a hora para una aplicación creada con Visual Studio para correrla en 64bits?

Entonces ha de ser muy probable que cuando la ejecute allí, obtenga un error como:

Retrieving the COM class factory for component with CLSID {XXXXXXX} failed due to the following error: 80040154.

Tal vez luego de esto trató por mucho medio de ver que pasaba, pero sin encontrar solución.

Aquí lo que sucede es que el código creado en Visual Basic, definitivamente tiene tipos no compatibles con la arquitectura x64.

Cuando se crean soluciones en Visual Studio, este por defecto las compila con la opción “Active CPU”. Es decir que cuando el JIT compiler pasa el MSIL a lenguaje nativo de máquina, hace la compilación con la arquitectura en la que se está desplegando la solución.

Así que cuando una aplicación que tiene referenciada una DLL de VB6 que solo soporta 32bits se ejecuta en x86, ésta se compila y ejecuta correctamente. Pero en bien se pasa a x64, todo pasa a 64 bits. Y como la dll de Visual Basic 6 no soporta esa conversión, por lo tanto se genera el error. (Aún cuando originalmente se haya compilado en una máquina de 32 bits. Recuerden que la opción por defecto es "Active CPU").

La solución consiste entonces en especificar para cada proyecto que referencie la DLL en cuestión ( y cualquier otra que falle) que la compilación se debe hacer explícitamente a x86. Así aun cuando se corra el código en una máquina de x64, el código final estará en 32 bits y por ende será compatible con la dll.

Aunque esta es la única solución aparte de tener que migrar todo el código de VB (cosa completamente aconsejable a mediano plazo), ha de tenerse en cuenta que si su aplicación tiene utilidades muy atadas a 64bits (cosa que no creo), entonces estas dejarán de funcionar.

Comments

  • Anonymous
    June 08, 2013
    Dices que "...La solución consiste entonces en especificar para cada proyecto que referencie la DLL en cuestión ( y cualquier otra que falle) que la compilación se debe hacer explícitamente a x86." ¿Y como se hace eso?