¿Cómo puedo llamar a un DLL desde un lenguaje de scripting?

Tengo un producto de terceros, un emulador de terminal, que proporciona una DLL que se puede vincular a un progtwig de C para automatizar básicamente la conducción de este producto (enviar pulsaciones de teclas, detectar qué hay en la pantalla, etc.).

Quiero manejarlo desde un lenguaje de scripting (me siento cómodo con Python y un poco menos con Perl) para que no tengamos que comstackr y enviar archivos ejecutables a nuestros clientes siempre 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 aceptarán la idea de escribir y comstackr el código C.

¿Cuál es una buena manera de hacer que Python / Perl se conecte a una DLL de Windows? Mi primer pensamiento fue escribir un progtwig de servidor y hacer que un script de Python se comunique con él a través de TCP, pero tiene que haber una solución más fácil.

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

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

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

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

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

Supongo que no veo una distinción significativa entre “comstackr y enviar ejecutables” y “comstackr y enviar scripts”.

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

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

Se necesitan aproximadamente una docena de líneas de código c / c ++ para lograrlo, pero es un 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 editor de Zeus que escribí usa este nombre para permitir que las macros de Zeus se escriban en Python y funciona muy bien.