2008-10-27 10 views
9

Tengo un producto de terceros, un emulador de terminal, que proporciona un archivo DLL que se puede vincular a un programa C para básicamente automatizar la conducción de este producto (enviar pulsaciones de teclas, detectar lo que está en la pantalla, etc.).¿Cómo puedo llamar a un archivo DLL desde un lenguaje de scripting?

Quiero manejarlo desde un lenguaje de script (me siento cómodo con Python y un poco menos con Perl) para que no tengamos que compilar y enviar ejecutables a nuestros clientes cada vez que se encuentre un problema.

También queremos que los clientes puedan escribir sus propios scripts utilizando los nuestros como líneas de base y no tendrán la idea de escribir y compilar el código C.

¿Cuál es una buena manera de conseguir que Python/Perl interactúe con una DLL de Windows? Mi primer pensamiento fue escribir un programa de servidor y tener una secuencia de comandos de Python para comunicarse con él a través de TCP, pero tiene que haber una solución más fácil.

Respuesta

15

Una forma de llamar a bibliotecas de C desde Python es usar ctypes:

>>> from ctypes import * 
>>> windll.user32.MessageBoxA(None, "Hello world", "ctypes", 0); 
12

En Perl, Win32::API es una manera fácil de alguna interfaz de DLL. También está Inline::C, si tiene acceso a un compilador y a los encabezados de Windows.

Perl XSUB s también pueden crear una interfaz entre Perl y C.

+0

Agregue XS y nosotros mismos ganamos. –

5

En Perl, P5NCI hará también que, al menos en algunos casos. Pero me parece que todo lo que utilizas que gestiona directamente la interfaz con el dll va a ser hostil para el usuario, y si vas a tener un envoltorio amigable del usuario (scriptor?), También podría ser un módulo XS.

Supongo que no veo una distinción significativa entre "compilar y enviar ejecutables" y "compilar y enviar scripts".

4

Para Python, podría compilar una extensión que enlace a la DLL, de modo que en Python podría importarla como un módulo normal. Puede hacerlo a mano, utilizando una biblioteca como Boost.Python, o usando una herramienta como SWIG (que también admite Perl y otros lenguajes de scripting) para generar un contenedor automáticamente.

3

Python Py_InitModule La función API le permite crear un módulo a partir de funciones c/C++ que pueden ser llamadas desde Python.

Se tarda aproximadamente una docena de líneas de C/C++ código de lograr, pero es de código bastante fácil de escribir:

https://python.readthedocs.org/en/v2.7.2/extending/extending.html#the-module-s-method-table-and-initialization-function

El Zeus editor que he escrito, utiliza este appoach para permitir Zeus macros para escribir en Python y funciona muy bien.

+0

si escribió un ejemplo de "mundo hello" en su respuesta, en lugar de un enlace a una página que no es práctica, no sería el último de esta lista de respuestas :-) – Davide

+0

El enlace que proporcioné ya contiene un simple ejemplo 'hola mundo'. Desde el enlace proporcionado: "Se puede encontrar un ejemplo en el archivo Demo/embed/demo.c en la distribución fuente de Python". – jussij

Cuestiones relacionadas