2008-12-04 15 views
13

Tengo una aplicación Delphi similar a Taskbar Shuffle que incluye un dll de gancho.¿Es posible acceder a un dll de 64 bits desde una aplicación de 32 bits?

EDIT: Este gancho DLL se comunica con la aplicación principal mediante el envío de mensajes de Windows.

Quiero agregar soporte para XP y Vista x64 y mi idea inicial era convertir el dll a 64 bits (compilándolo con FreePascal) pero mantener la aplicación de 32 bits por ahora (Delphi).

¿Es posible que una aplicación de 32 bits acceda a un dll de 64 bits?

Edit2: Estoy cargando el archivo DLL mediante LoadLibrary, así que supongo que estoy atascado ya que un proceso de 32 bits no será capaz de cargar una DLL de 64 bits, de acuerdo con lo que he leído en el enlace apuntado por Lars Truijens en una de las respuestas a continuación.

Respuesta

6

No. Tendrá que compilar dos versiones: 64 bits y 32 bits.

+0

Incluso si la única tarea del hook dll es comunicarse con la aplicación principal para enviar mensajes de Windows? – smartins

+0

No, el dll de 32 bits se carga en el proceso de 64 bits o al revés. Si ese no es el caso, entonces no hay problema. –

+0

Respuesta incorrecta.Esto ahora es posible si crea un proceso de fondo de 64 bits. :) –

2

No, pero es posible que pueda evitar eso con COM. Si ejecuta el dll dentro de un objeto COM que se ejecuta como un proceso independiente, y se comunica con interfaces Marshallable (por ejemplo, interfaces compatibles con automatización), debería funcionar. No siempre es factible, según lo que haga el dll y cuán extensas sean las superficies de integración y de llamada, pero es una opción que debería ser capaz de hacer posible ese escenario.

+0

Solo si es un servicio COM fuera de proceso, como un EXE, DCOM o COM +. De lo contrario, el dll COM se cargaría en su proceso y debe haber sido compilado para la misma plataforma. –

9

Siempre que la DLL de 64 bits se cargue por un proceso separado de 64 bits, y toda la comunicación entre el proceso de 32 bits y la DLL de 64 bits se realice a través de mecanismos similares al IPC que el SO pueda administrar , entonces sí, puedes hacer eso.

He hecho algo similar. Una aplicación de 32 bits necesitaba un complemento de cola de impresión personalizado implementado en una DLL. La aplicación y el complemento de cola de impresión se comunican a través de los mecanismos de IPC (una forma elegante de decir archivos temporales, en este caso).

En sistemas de 64 bits, todo lo relacionado con la aplicación de 32 bits funcionaba bien excepto que Print Spooler se negó a cargar el complemento DLL, porque el Print Spooler era, por supuesto, un proceso de 64 bits.

La solución fue tan simple como reconstruir solo el complemento de Spooler en 64 bits. No es necesario cambiar toda la aplicación de 32 bits.

+0

Estoy cargando el dll a través de LoadLibrary, así que supongo que estoy atascado ya que un proceso de 32 bits no podrá cargar un dll de 64 bits, de acuerdo con lo que leí en el enlace apuntado por Lars Truijens. – smartins

6

Me acabo de enterar de esta solución, desde CodeCentral: http://cc.embarcadero.com/Author/802978

Permite llamar a cualquier biblioteca de 64 bits de código de 32 bits.

Es una solución compleja, ejecutando un ejecutable escrito de 64 bits en segundo plano, luego comunicándose con él utilizando archivos asignados de memoria y mensajes GDI de Windows para iniciar algunas funciones de 64 bits de un proceso Delphi de 32 bits.

Hay un ejemplo que puede cargar cualquier biblioteca de 64 bits y luego llamar a cualquier función de esta biblioteca desde un ejecutable de 32 bits.

Parece que funciona bien. En todos los casos, el código vale la pena mirarlo: ¡es técnico, pero está bien diseñado!

+0

¿Está seguro de que puede llamar a * cualquier * biblioteca de 64 bits del código de 32 bits? Una biblioteca de 64 bits podría devolver datos que pueden ser inaccesibles a partir de un proceso de 32 bits. –

+0

Este "puente" maneja una gran cantidad de tipos de datos: registros de 64 bits, SIMD XMM y YMM, registros x87 e incluso AVX. Los búfers de memoria se manejarán a través del archivo mapeado en la memoria. Los datos se devuelven a 32 bits tal como se recibió de la biblioteca de 64 bits. Por lo tanto, es posible que deba llamar más tarde a la versión de 64 bits de la API si desea jugar con un identificador recuperado de 64 bits. Como puede escribir su propia función de 64 bits (si conoce un poco de asm), puede hacer lo que quiera con esta biblioteca, si el puente predeterminado no es suficiente para usted. Si sabe lo que está haciendo, puede llamar a * cualquier * biblioteca de 64 bits. –

+0

Para un manejo más complejo, puede escribir algún contenedor usando la versión de 64 bits de FreePascal, luego llame a esta biblioteca de FPC con este puente desde su aplicación principal Delphi de 32 bits. –

Cuestiones relacionadas