tag - Usando Windows DLL desde Linux
puddletag (8)
Necesitamos una interfaz con una aplicación de terceros, pero la compañía que está detrás de la aplicación no divulga el protocolo de mensajes y proporciona solo la DLL de Windows con la que interactuar.
Nuestra aplicación está basada en Linux, por lo que no puedo comunicarme directamente con 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.
A veces es mejor escoger un pequeño proveedor que un proveedor 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 probablemente sea muy inconveniente, especialmente si todo el resto de su infraestructura ejecuta Linux.
¿El proveedor apoyará el uso de su biblioteca dentro de una VM de Windows? Si el rendimiento no es crítico, es posible que pueda hacer eso.
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 aplicación de PC simple para exponer las funciones de DLL, ya sea utilizando un protocolo homebrew, o tal vez protocolos XML-RPC, SOAP o JSON. RemObjects SDK podría ayudarlo, 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.
También es poco probable que MONO sea de ayuda, ya que su DLL probablemente NO sea un ensamblado .NET.
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.
No lo he hecho, pero es posible que puedas crear un contenedor usando MONO.
OMI, la mejor apuesta es usar Sockets. He hecho esto previamente y funciona como un encanto.
Obtenga un sniffer y aprenda el protocolo. Eso es lo que estoy haciendo.
Han pasado algunos años desde que se hizo la pregunta, pero aquí hay otro enfoque. Utilice 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 terminan con una instrucción ret
.
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 las DLL de Windows 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 en muchos casos de uso / escenarios diferentes, lo diseñé como un ctypes
módulo ctypes
"genérico", que hace la mayoría de las tuberías necesarias de forma automática en segundo plano.
Ejemplo: supongamos que está en Python en Linux, tiene Wine instalado y desea llamar a msvcrt.dll
(la biblioteca de tiempo de ejecución de Microsoft C). Puedes 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))
Código fuente (LGPL) , paquete PyPI y documentación .
Todavía es un poco difícil en los bordes (es decir, alfa e inseguro), pero maneja la mayoría de los tipos de parámetros (incluidos los punteros).