Использование Windows DLL из Linux - PullRequest
       27

Использование Windows DLL из Linux

19 голосов
/ 17 декабря 2008

Нам необходимо подключиться к стороннему приложению, но компания, стоящая за приложением, не раскрывает протокол сообщений и предоставляет только Windows DLL для взаимодействия.

Наше приложение основано на Linux, поэтому я не могу напрямую общаться с DLL. Я не смог найти никакого существующего решения, поэтому я рассматриваю возможность создания моста на основе сокетов между Linux и Windows, однако я уверен, что это не такая уж уникальная проблема, и кто-то должен был сделать это раньше.

Известно ли вам о каком-либо решении, которое позволяет вызывать функции Windows DDL из приложения C в Linux? Он может использовать Wine или отдельный компьютер с Windows - не имеет значения.

Большое спасибо заранее.

Ответы [ 7 ]

9 голосов
/ 17 декабря 2008

Любое решение будет нуждаться в "удаленном" слое на основе TCP / IP между DLL, работающей в "windows-like" среде, и вашим приложением linux.

Вам потребуется написать простое приложение для ПК, чтобы представить функции DLL, используя либо протокол homebrew, либо протоколы XML-RPC, SOAP или JSON. RemObjects SDK может помочь вам, но может быть излишним.

Я бы остановился на «реальном» или виртуализированном ПК. Если вы используете Wine, разработчики DLL вряд ли предложат какую-либо поддержку.

MONO также вряд ли поможет, поскольку ваша DLL, вероятно, НЕ является сборкой .NET.

6 голосов
/ 06 декабря 2017

Хотя этот вопрос довольно старый, тема, по-видимому, не потеряла своей актуальности. Если вы можете использовать или используете Python ... вот мое решение.

Я написал небольшой модуль Python для вызова библиотек Windows из Python для Linux. Он основан на IPC между обычным процессом Python для Linux / Unix и процессом Python на основе Wine. Поскольку я нуждался в нем во многих различных сценариях использования / сценариях сам, я разработал его как «универсальный» ctypes модуль вставную замену, которая автоматически выполняет большинство необходимых работ в фоновом режиме .

Пример: предположим, что вы работаете в Python под Linux, у вас установлен Wine и вы хотите вызвать msvcrt.dll (библиотека времени выполнения Microsoft C). Вы можете сделать следующее:

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))

Исходный код (LGPL) , Пакет PyPI & документация .

Это все еще немного шероховато по краям (то есть альфа и небезопасно), но он обрабатывает большинство типов параметров (включая указатели).

3 голосов
/ 18 декабря 2008

Иногда лучше выбрать мелкого продавца, чем крупного, потому что размер вашего бизнеса придаст им больше значения. Мы наверняка нашли это у поставщиков AV-движков.

Если вы достаточно важны для них, они должны предоставить документированный поддерживаемый протокол, сборку библиотеки для Linux или исходный код для библиотеки.

В противном случае вам придется запускать Windows-блок в цикле с использованием RPC, как отмечали другие, что, вероятно, будет очень неудобно, особенно если вся остальная часть вашей инфраструктуры работает под управлением Linux.

Будет ли поставщик поддерживать использование своей библиотеки в виртуальной машине Windows? Если производительность не критична, вы можете сделать это.

1 голос
/ 17 декабря 2008

Вызов самих функций DLL - это, конечно, только верхушка айсберга. Что если DLL вызывает Win32, то у вас возникнет довольно большая проблема с линковкой. Я думаю, что Wine может помочь вам, но не уверен, что они найдут решение.

0 голосов
/ 05 марта 2019

У Тависа Орманди есть код, который способен связывать Windows DLL и вызывать функции из исполняемого файла Linux. Концепция демонстрируется вызовом mpengine from в MS Windows Defender для сканирования (вредоносных) файлов:

https://github.com/taviso/loadlibrary

0 голосов
/ 26 октября 2015

Прошло несколько лет с тех пор, как был задан вопрос, но здесь есть другой подход. Используйте objdump -d, чтобы разобрать DLL. Вы можете получить чистый, незапятнанный мусор или код, полный вызовов Windows, или и то, и другое. Функции часто ограничиваются серией инструкций push и заканчиваются инструкцией ret.

0 голосов
/ 17 декабря 2008

IMO, лучше всего использовать сокеты. Я сделал это ранее, и это работает как шарм.

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