Как я могу вызвать DLL из скриптового языка? - PullRequest
9 голосов
/ 27 октября 2008

У меня есть сторонний продукт, эмулятор терминала, который предоставляет DLL, которая может быть связана с программой на C, чтобы в основном автоматизировать управление этим продуктом (отправлять нажатия клавиш, определять, что на экране и т. Д.).

Я хочу использовать его на языке сценариев (мне удобно с Python и немного меньше с Perl), чтобы нам не приходилось компилировать и отправлять исполняемые файлы нашим клиентам в случае обнаружения проблемы.

Мы также хотим, чтобы клиенты могли писать свои собственные сценарии, используя наши в качестве базовых, и они не будут развлекать идею написания и компиляции кода на Си.

Какой хороший способ заставить Python / Perl взаимодействовать с Windows DLL. Моей первой мыслью было написать серверную программу и заставить скрипт Python связываться с ней через TCP, но должно быть более простое решение.

Ответы [ 5 ]

15 голосов
/ 27 октября 2008

Одним из способов вызова библиотек C из Python является использование ctypes :

>>> from ctypes import *
>>> windll.user32.MessageBoxA(None, "Hello world", "ctypes", 0);
12 голосов
/ 27 октября 2008

В Perl Win32 :: API - это простой способ взаимодействия с DLL. Существует также Inline :: C , если у вас есть доступ к компилятору и заголовкам Windows.

Perl XSUB s также может создавать интерфейс между Perl и C.

5 голосов
/ 27 октября 2008

В Perl P5NCI также сделает это, по крайней мере, в некоторых случаях. Но мне кажется, что все, что вы используете, которое напрямую управляет взаимодействием с dll, будет недружественным для пользователя, и если вы собираетесь иметь дружественную оболочку для пользователя (scriptor?), Это может быть также модуль XS.

Полагаю, я не вижу значимого различия между "компилировать и отправлять исполняемые файлы" и "компилировать и отправлять сценарии".

4 голосов
/ 27 октября 2008

Для Python вы можете скомпилировать расширение, которое ссылается на DLL, чтобы в Python вы могли просто импортировать его как обычный модуль. Вы можете сделать это вручную, используя библиотеку, например Boost.Python, или используя инструмент, такой как SWIG (который также поддерживает Perl и другие языки сценариев), для автоматического создания оболочки.

3 голосов
/ 28 октября 2008

API-функция Python Py_InitModule позволяет создавать модуль из функций c / c ++, которые затем можно вызывать из Python.

Требуется около десятка или около того строк кода на c / c ++, но написать код довольно просто:

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

Редактор Zeus , который я написал, использует этот подход для написания макросов Zeus на Python, и он работает очень хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...