У меня есть сторонний продукт, эмулятор терминала, который предоставляет DLL, которая может быть связана с программой C, чтобы в основном автоматизировать управление этим продуктом (отправлять нажатия клавиш, определять, что на экране, и т. д.).
Я хочу использовать его на языке сценариев (мне нравится Python и немного меньше - Perl), чтобы нам не приходилось компилировать и отправлять исполняемые файлы нашим клиентам всякий раз, когда обнаруживается проблема.
Мы также хотим, чтобы клиенты могли писать свои собственные сценарии, используя наши в качестве базовых, и им не понравится идея написания и компиляции кода C.
Какой хороший способ заставить Python / Perl взаимодействовать с Windows DLL? Моей первой мыслью было написать серверную программу и связать с ней скрипт Python через TCP, но должно быть более простое решение.






Один из способов вызвать библиотеки C из Python - использовать ctypes:
>>> from ctypes import *
>>> windll.user32.MessageBoxA(None, "Hello world", "ctypes", 0);
В Perl Win32 :: API - это простой способ взаимодействия с библиотеками DLL. Также существует Встроенный :: C, если у вас есть доступ к компилятору и заголовкам окон.
Perl XSUB также может создавать интерфейс между Perl и C.
В Perl P5NCI также будет делать это, по крайней мере, в некоторых случаях. Но мне кажется, что все, что вы используете, что напрямую управляет взаимодействием с dll, будет недружелюбно для пользователя, и если у вас будет удобная для пользователя (сценариста?) Оболочка, это может быть также модуль XS.
Думаю, я не вижу значимого различия между «компилировать и отправлять исполняемые файлы» и «компилировать и отправлять скрипты».
Для Python вы можете скомпилировать расширение, которое ссылается на DLL, чтобы в Python вы могли просто импортировать его как обычный модуль. Вы можете сделать это вручную, используя такую библиотеку, как Boost.Python, или используя такой инструмент, как SWIG (который также поддерживает Perl и другие языки сценариев) для автоматического создания оболочки.
Функция Python Py_InitModule API позволяет создавать модуль из функций c / C++, которые затем можно вызывать из Python.
Для реализации требуется около дюжины строк кода c / C++, но написать такой код довольно просто:
Редактор Зевс, который я написал, использует это приложение для написания макросов Зевс на Python, и он работает очень хорошо.
если вы написали в своем ответе пример «привет, мир» вместо ссылки на страницу, которая нецелесообразна, вы не будете последним из этого списка ответов :-)
Ссылка, которую я предоставил, уже содержит простой пример «привет, мир». По предоставленной ссылке: «Пример можно найти в файле Demo / embed / demo.c в дистрибутиве исходного кода Python».
Добавьте XS, и мы получим победителя.