Использование 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.