Linux установка сторонних dll

Проблема следующая: В свое время мы на фирме написали приложение под Виндовс. Теперь стоит задача переписать его под Линух. Проблема в том, что в этом приложении используется длл-ка от стороннего производителя. Исходников длл-ки нет. Поэтому хотел спросить: как можно сделать так, чтобы можно было вызывать функции этой длл-ки из под Линух.

Re: Как запускать Windows dll-ку из под Linux

Можно попытаться поковырять WINE на этот счет, есть ли у него интерфейсы вызова.

Re: Как запускать Windows dll-ку из под Linux

Ещё MPEG-4 плееры под Линукс активно пользуют виндовые ДЛЛ.

Re: Как запускать Windows dll-ку из под Linux

>Ещё MPEG-4 плееры под Линукс активно пользуют виндовые ДЛЛ.
дык они вроде как не совсем виндовые используют, всмысле это не те же самые кодеки что ставятся под вин

Re: Как запускать Windows dll-ку из под Linux

>дык они вроде как не совсем виндовые используют, всмысле это не те
>же самые кодеки что ставятся под вин А какие же? Самые настоящие dll’ки из виндов, если нет нативного
кодека, то минипорт из wine в плеерах позволяет как раз использовать
виндовую dll’ку, квиктайм например так юзают.

Re: Как запускать Windows dll-ку из под Linux

Я так понял, есть следующие варианты решения моей проблемы: 1) Написать маленькое Виндовс-приложение, которое содержит вызовы к моей Windows длл-ке. Это приложение работает например через командную строку. Опрашивая определенный параметр в коммандной строке приложение вызывает определенную функцию длл-ки. Порядок работы с длл-кой я вижу таким: моя линуховая прога вызывает виндовую прогу через Wine с определенным списком параметров коммандной строки. Виндовая прога дергает нужную функцию длл-ки и возвращает результат (интересно, как?). 2) Использовать WineLib для перекомпиляции моей виндовой длл-ки. Я так понял, можно взять бинарную длл-ку без исходников, и WineLib может сделать из нее линуховый бинарник? 3) Лучшим выходом из положения было-бы переписать длл-ку самостоятельно. Вот только проблема в чем. Эта длл-ка — это длл-ка от стороннего производителя. Она реализует часть функций набора компонент для сжатия файлов ZipTV. В частности, мы используем алгоритм BlackHole для упаковки файлов. От использования этого алгоритма мы отказаться не можем. Этот алгоритм является фирменным закрытым алгоритмом производителя этих компонент для Дельфи. Поэтому переписать нам этот алгоритм не получится. Я пытался найти библиотеку, реализующую этот алгоритм для Линуха. Так и не нашел 🙁

Re: Как запускать Windows dll-ку из под Linux

>2) Использовать WineLib для перекомпиляции моей виндовой длл-ки. Я
>так понял, можно взять бинарную длл-ку без исходников, и WineLib
>может сделать из нее линуховый бинарник? Так собственно и cделано в mplayer, xine, aviplayer.

>Она реализует часть функций набора компонент для сжатия файлов
>ZipTV. В частности, мы используем алгоритм BlackHole для упаковки
>файлов. От использования этого алгоритма мы отказаться не можем.
>Этот алгоритм является фирменным закрытым алгоритмом производителя
>этих компонент для Дельфи Ну это совсем такой же случай, как и с плеерами, можно взять
рипнутый вине из любого плеера, который работает с дллками и
написать свой врапер, сошку слинкованную с libwine.a из рипнутого
wine, далее просто пишите свою программу, которая будет работать с
этой либой. Есть только одна проблема, может оказаться так, что в
рипнутой wine не будет нужных виндузячих API функций, тогда придется
их брать из полного wine, или вообще не парится и взять libwine из
полной версии wine сразу, это позволит использовать большое кол-во виндузячих функций, а так же сетевую поддержку.

Re: Как запускать Windows dll-ку из под Linux

>>Использовать WineLib для перекомпиляции моей виндовой длл-ки. Я >>так понял, можно взять бинарную длл-ку без исходников, и WineLib >>может сделать из нее линуховый бинарник? >Так собственно и cделано в mplayer, xine, aviplayer. Я тут рылся в документации WineLib и насколько я понял, WineLib позволяет делать Виндовые библиотеки под Линух только при наличии исходников. У меня же исходников длл-ки нет :(. >Ну это совсем такой же случай, как и с плеерами, можно взять >рипнутый вине из любого плеера, который работает с дллками и >написать свой врапер, сошку слинкованную с libwine.a из рипнутого >wine, далее просто пишите свою программу, которая будет работать с >этой либой. Есть только одна проблема, может оказаться так, что в >рипнутой wine не будет нужных виндузячих API функций, тогда придется >их брать из полного wine, или вообще не парится и взять libwine из >полной версии wine сразу, это позволит использовать большое кол-во >виндузячих функций, а так же сетевую поддержку. Звучит сложно. Но, если другого варианта не будет, то придется так.

Re: Как запускать Windows dll-ку из под Linux

Млин, повторюсь, ато получилось непонятно: >>Использовать WineLib для перекомпиляции моей виндовой длл-ки. Я >>так понял, можно взять бинарную длл-ку без исходников, и WineLib >>может сделать из нее линуховый бинарник? >Так собственно и cделано в mplayer, xine, aviplayer. Я тут рылся в документации WineLib и насколько я понял, WineLib позволяет делать Виндовые библиотеки под Линух только при наличии исходников. У меня же исходников длл-ки нет :(.

>Ну это совсем такой же случай, как и с плеерами, можно взять >рипнутый вине из любого плеера, который работает с дллками и >написать свой врапер, сошку слинкованную с libwine.a из рипнутого >wine, далее просто пишите свою программу, которая будет работать с >этой либой. Есть только одна проблема, может оказаться так, что в >рипнутой wine не будет нужных виндузячих API функций, тогда придется >их брать из полного wine, или вообще не парится и взять libwine из >полной версии wine сразу, это позволит использовать большое кол-во >виндузячих функций, а так же сетевую поддержку. Звучит сложно. Но, если другого варианта не будет, то придется так. Источник

Linux установка сторонних dll

Здравствуйте, Alexey_VL, Вы писали: >Пытась найти ответ на winehq.org, но пока безуспешно. Сам сейчас поэксперементировал, получилось вот что.
Нашел в интернете готовую Windows DLL — из руководства, как делать DLL в Windows (http://www.flipcode.com/archives/Creating_And_Using_DLLs.shtml).
Взял оттуда код, который загружает DLL и выполняет из неё функции, немного подрихтовал и получил вот что: Собирать при помощи вот такой команды:

На выходе будет файл с названием dllrun.exe, запускать его.

От: Alexey_VL
Дата: 19.10.09 09:58
Оценка:
От: Sheridan
Дата: 19.10.09 10:35
Оценка:

Приветствую, Alexey_VL, вы писали: Можно озвучить — для чего? Что в той длл такого?

От: Alexey_VL
Дата: 19.10.09 11:07
Оценка:

S>Можно озвучить — для чего? Что в той длл такого? В DLL драйвер под Виндос для устройства на СОМ-порте, который можно самостоятельно написать и под Linux, но это потребует времени. Задача как можно быстрее начать работать с устройством для демонстрации оного. В дальнейшем уже можно будет сделать нормально, написав драйвер под Linux. Ну и вообще для общего развития интересно — неужели нет проги-эмулятора, позволяющей работать с виндовскими длл-ками в Линуксе, с учетом существования WINE

От: rising_edge
Дата: 19.10.09 11:13
Оценка:

Здравствуйте, Alexey_VL, Вы писали: S>>Можно озвучить — для чего? Что в той длл такого?

A_V>В DLL драйвер под Виндос для устройства на СОМ-порте А оная DLL небось через драйвер COM-порта работает? И как вы собираетесь виндовой DLL лазить в устройство через линуксовый драйвер COM-порта?

От: Sheridan
Дата: 19.10.09 11:17
Оценка:
От: LuciferSaratov
Дата: 19.10.09 11:24
Оценка:

Здравствуйте, Alexey_VL, Вы писали: A_V>Я так понимаю, что мне winelib не подойдет, потому что у меня Linux-приложение, которое я не могу скомпилировать как виндовское с помощью Winelib. Исходников dll-ки у меня тоже нет. Насколько я понимаю, вот эти самые winegcc и wineg++ никоим образом не запрещают использовать обычные линуксовые библиотеки и системные вызовы. Т.е. если собирать программу при помощи winegcc, то можно использовать как WinAPI, так и линуксовые API.
Код, необходимый для инициализации WINE, winegcc генерирует сам.

От: Alexey_VL
Дата: 19.10.09 11:32
Оценка:

_>А оная DLL небось через драйвер COM-порта работает? И как вы собираетесь виндовой DLL лазить в устройство через линуксовый драйвер COM-порта? Хм, а собственно почему виндовой? Я так понимаю WINE подменяет вызовы виндос длл-ок на свои реализации. Думаю kernel32 входит в число длл-ок вызовы которых заменили.

От: Alexey_VL
Дата: 19.10.09 11:41
Оценка:

S>А демонстрацию лучше на виндах демонстрируйте, раз уж там готовое есть. Суть в том, что продемонстрировать надо работу Linux-программы. Так что виндос тут не подходит. AVL>>Ну и вообще для общего развития интересно — неужели нет проги-эмулятора, позволяющей работать с виндовскими длл-ками в Линуксе, с учетом существования WINE
S>А оно надо? Оно ненадо. Да и вредно. Хм, ну мне вот сейчас например надо. И судя по количеству аналогичных вопросов в нете, не только мне. Это может и не здорово для использования как архитектурное решение, но в плане временно поставить стороннюю длл-ку в свое Линукс приложение при портировании очень даже неплохо — можно сразу смотреть что получается.

От: Alexey_VL
Дата: 19.10.09 11:47
Оценка:

LS>Насколько я понимаю, вот эти самые winegcc и wineg++ никоим образом не запрещают использовать обычные линуксовые библиотеки и системные вызовы. Т.е. если собирать программу при помощи winegcc, то можно использовать как WinAPI, так и линуксовые API.
LS>Код, необходимый для инициализации WINE, winegcc генерирует сам. Угу, дочитал Wine-wiki до ответа на свой вопрос. А если у меня только часть исходников Linux-проги, которая используются для собирания so библиотек — никаких подводных камней не возникнет при стыковке с основной частью приложения, которая собрана обычным gcc?

От: LuciferSaratov
Дата: 19.10.09 12:05
Оценка:

Здравствуйте, Alexey_VL, Вы писали:

A_V>Угу, дочитал Wine-wiki до ответа на свой вопрос. А если у меня только часть исходников Linux-проги, которая используются для собирания so библиотек — никаких подводных камней не возникнет при стыковке с основной частью приложения, которая собрана обычным gcc? Я думаю, чтобы проблем не было, нужно итоговый исполняемый файл линковать при помощи winegcc/wineg++ — чтобы были прилинкованы все нужные библиотеки.

От: Alexey_VL
Дата: 19.10.09 14:00
Оценка:

LS>Я думаю, чтобы проблем не было, нужно итоговый исполняемый файл линковать при помощи winegcc/wineg++ — чтобы были прилинкованы все нужные библиотеки. В итоге нашел все ответы на свои вопросы в Wine-wiki. Спасиб за ссылку Вот похоже наиболее оптимальный подход для решения задачи по использованию длл-ки в Линукс приложении (из Wine-wiki):

A programmer asked Jun 2007 Wine devel]: [How can I write a shared library that uses Wine and can be called from a non-winelib app?]

S. Dossinger: your plugin, that loads the dll, needs to run in Wine’s environment in order to be able to load the dll. So you have to write a winelib dll. If the plugin is loaded as a library in your host app, the whole host app would have to be a winelib app. Not good So you can split your plugin into two parts, one is the plugin that runs in the host app, the other one is a seperate winelib application that runs in a seperate process and loads the win32 dll. That way the dll gets the virtual memory setup it needs. The two parts of your plugin can use any Unix IPC techniques you feel like using — sockets, pipes, shared memory, semaphores, whatever. You could forward function calls using pipes, transport bigger blobs using shared memory, and synchronise everything using semaphores(and implicit pipe synchronisation). Источник