2008-12-17 14 views
16

Necesitamos hacer interfaz con aplicaciones de terceros, pero la compañía que está detrás de la aplicación no revela el protocolo de mensajes y solo proporciona la DLL de Windows para interactuar.Usando Windows DLL desde Linux

Nuestra aplicación está basada en Linux, por lo que no puedo comunicarme directamente con la DLL. No pude encontrar ninguna solución existente, así que estoy considerando escribir un puente basado en el socket entre Linux y Windows, sin embargo, estoy seguro de que no es un problema tan único y alguien debería haberlo hecho antes.

¿Conoce alguna solución que permita llamar a las funciones DDL de Windows desde la aplicación C en Linux? Puede usar Wine o separar Windows PC, no importa.

Muchas gracias de antemano.

Respuesta

8

Cualquier solución va a necesitar una capa de "conexión remota" basada en TCP/IP entre la DLL que se ejecuta en un entorno "similar a Windows" y su aplicación de Linux.

Tendrá que escribir una sencilla aplicación para PC para exponer las funciones de DLL, ya sea utilizando un protocolo homebrew, o tal vez protocolos XML-RPC, SOAP o JSON. El RemObjects SDK podría ayudarte, pero podría ser excesivo.

Me quedaría con una PC "real" o virtualizada. Si usa Wine, es poco probable que los desarrolladores DLL ofrezcan ningún soporte.

MONO también es poco probable que sea de alguna ayuda, porque su DLL probablemente NO es un ensamblado .NET.

1

Llamar a las funciones de la DLL es, por supuesto, solo la punta del iceberg. Qué pasa si el DLL llama a Win32, entonces tendrías un problema de enlace masivo. Supongo que Wine podría ayudarte por ahí, sin estar seguro de si ofrecen una solución.

+0

La última vez que verifiqué, WINE solo se podía usar para alojar procesos y no archivos DLL individuales dentro de un proceso que no era WINE. –

-1

No lo he hecho, pero es posible que pueda crear un contenedor para él con MONO.

0

IMO, la mejor opción es usar Sockets. He hecho esto previamente y funciona como un encanto.

+0

Esa fue mi idea inicial. Parece que esa es la forma en que tengo que ir. – qrdl

2

A veces es mejor elegir un pequeño proveedor que un vendedor grande porque el tamaño de su negocio le dará más peso para ellos. Sin duda, hemos encontrado esto con los proveedores de motores AV.

Si es lo suficientemente importante para ellos, deben proporcionar un protocolo documentado y compatible, una compilación Linux de la biblioteca o el código fuente de la biblioteca.

De lo contrario, tendrá que ejecutar un cuadro de Windows en el bucle mediante RPC, como han señalado otros, lo que puede ser muy inconveniente, especialmente si todo el resto de su infraestructura ejecuta Linux.

¿El proveedor admite el uso de su biblioteca dentro de una VM de Windows? Si el rendimiento no es crítico, es posible que pueda hacer eso.

6

Obtenga un sniffer y aprenda el protocolo. Eso es lo que estoy haciendo.

0

Han pasado algunos años desde que se hizo la pregunta, pero este es otro enfoque. Use objdump -d para desensamblar la DLL. Puede obtener basura pura, no adulterada, o un código lleno de llamadas a Windows, o ambas cosas. Las funciones a menudo están delimitadas por una serie de instrucciones push y finalizan con una instrucción ret.

3

Aunque esta pregunta es bastante antigua, el tema aparentemente no ha perdido su relevancia. Si puedes usar o estás usando Python ...aquí está mi solución.

Escribí un pequeño módulo de Python para llamar a Windows DLL desde Python en Linux. Está basado en IPC entre un proceso regular de Linux/Unix Python y un proceso basado en Wine Python. Debido a que lo he necesitado también en muchos casos de uso/escenarios diferentes, lo diseñé como un reemplazo "genérico" ctypes module, que hace la mayoría de las tuberías requeridas automáticamente en el fondo.

Ejemplo: supongamos que está en Python en Linux, tiene Wine instalado y desea llamar al msvcrt.dll (la biblioteca de tiempo de ejecución de Microsoft C). Puede hacer lo siguiente:

import zugbruecke as ctypes 
dll_pow = ctypes.cdll.msvcrt.pow 
dll_pow.argtypes = (ctypes.c_double, ctypes.c_double) 
dll_pow.restype = ctypes.c_double 
print('You should expect "1024.0" to show up here: "%.1f".' % dll_pow(2.0, 10.0)) 

Source code (LGPL), PyPI package & documentation.

Todavía es un poco áspero en los bordes (es decir, alfa e inseguro), pero maneja la mayoría de los tipos de parámetros (incluidos los punteros).

Cuestiones relacionadas