Использование Windows DLL из Linux
Нам нужно взаимодействовать с сторонним приложением, но компания за приложением не раскрывает протокол сообщений и предоставляет только DLL для Windows.
Наше приложение основано на Linux, поэтому я не могу напрямую общаться с DLL. Я не мог найти какое-либо существующее решение, поэтому я рассматриваю возможность создания моста на основе сокетов между Linux и Windows, однако я уверен, что это не такая уникальная проблема, и кто-то должен был это сделать раньше.
Знаете ли вы о любом решении, которое позволяет вызывать функции Windows DDL из приложения C в Linux? Он может использовать Wine или отдельный Windows PC - не имеет значения.
Большое спасибо заранее.
Ответы
Ответ 1
Любому решению будет нужен "удаленный" слой на основе TCP/IP между DLL, который работает в "подобной окну" среде, и в вашем приложении linux.
Вам нужно написать простое приложение для ПК, чтобы разоблачить функции DLL, используя протокол доморощенного или, возможно, XML-RPC, SOAP или JSON-протоколы. RemObjects SDK может вам помочь, но может быть переполнен.
Я бы придерживался "реального" или виртуального ПК. Если вы используете Wine, разработчики DLL вряд ли будут предлагать какую-либо поддержку.
MONO также вряд ли поможет, потому что ваша DLL, вероятно, НЕ является сборкой .NET.
Ответ 2
Получите сниффера и изучите протокол. Это то, что я делаю.
Ответ 3
Иногда лучше выбрать маленького продавца над крупным вендором, потому что размер вашего бизнеса даст вам больше веса для них. Мы, безусловно, нашли это с поставщиками двигателей AV.
Если вы достаточно важны для них, они должны предоставить либо документированный, поддерживаемый протокол, либо сборку библиотеки Linux, либо исходный код в библиотеке.
В противном случае вам придется запускать окно Windows в цикле, используя RPC, как отмечали другие, что, вероятно, будет очень неудобно, особенно если вся остальная инфраструктура работает под Linux.
Будет ли поставщик поддерживать использование своей библиотеки в виртуальной машине Windows? Если производительность не является критичной, вы можете это сделать.
Ответ 4
Вызов функций DLL - это, конечно, только верхушка айсберга. Что делать, если DLL вызывает Win32, тогда у вас будет довольно массивная проблема связывания. Я думаю, Wine может помочь вам там, не уверен, что они предоставляют решение.
Ответ 5
Хотя этот вопрос довольно старый, тема, по-видимому, не утратила своей актуальности. Если вы можете использовать или использовать Python... вот мое решение.
Я написал небольшой модуль Python для вызова в Windows DLL из Python в Linux. Он основан на IPC между обычным процессом Linux/Unix Python и процессом Python на основе Wine. Поскольку я сам нуждался в этом слишком много разных сценариев/сценариев, я разработал его как "общий" ctypes
module, взамен, что делает большую часть необходимой сантехники автоматически в фоновом режиме.
Пример. Предположим, что вы находитесь на 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 и документация.
Он все еще немного грубый по краям (т.е. альфа и небезопасный), но он обрабатывает большинство типов параметров (включая указатели).
Ответ 6
ИМО, лучше всего использовать сокеты. Я сделал это раньше, и это работает как шарм.
Ответ 7
Прошло несколько лет с тех пор, как был задан вопрос, но вот еще один подход. Используйте objdump -d
, чтобы разобрать DLL. Вы можете получить чистый, нерассушенный мусор или код, полный вызовов Windows, или и то, и другое. Функции часто ограничиваются рядом инструкций push
и заканчиваются инструкцией ret
.
Ответ 8
Я не сделал этого, но вы могли бы создать оболочку для него с помощью MONO.