URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1904
[ Назад ]

Исходное сообщение
"Как запускать Windows dll-ку из под Linux"

Отправлено Vetal , 23-Июл-03 18:43 
Как запускать Windows dll-ку из под Linux
Всем привет!
Проблема следующая: В свое время мы на фирме написали приложение под Виндовс. Теперь стоит задача переписать его под Линух. Проблема в том, что в этом приложении используется длл-ка от стороннего производителя. Исходников длл-ки нет. Поэтому хотел спросить: как можно сделать так, чтобы можно было вызывать функции этой длл-ки из под Линух.

Заранее спасибо

Виталий Б.


Содержание

Сообщения в этом обсуждении
"Как запускать Windows dll-ку из под Linux"
Отправлено Max Zinal , 23-Июл-03 20:04 
>Как запускать Windows dll-ку из под Linux
>Всем привет!
>Проблема следующая: В свое время мы на фирме написали приложение под Виндовс.
>Теперь стоит задача переписать его под Линух. Проблема в том, что
>в этом приложении используется длл-ка от стороннего производителя. Исходников длл-ки нет.
>Поэтому хотел спросить: как можно сделать так, чтобы можно было вызывать
>функции этой длл-ки из под Линух.
>
>Заранее спасибо
>
>Виталий Б.

Советую посмотреть в сторону Wine. Должен заметить, что
внедрить оную DLLку в Linuxовый процесс вам не удастся.
Либо полностью Виндозное приложение, запускаемое в
эмуляторе, либо Линуксовый процесс, запускающий эмулятор
для выполнения маааленького участка кода, в коем используется
эта DLLка и передающего результат Линуксовому процессу.

Успехов!


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

"Как запускать Windows dll-ку из под Linux"
Отправлено Max V. Zinal , 24-Июл-03 20:30 
>Я так понял, есть следующие варианты решения моей проблемы:
>1) Написать маленькое Виндовс-приложение, которое содержит вызовы к моей
>Windows длл-ке. Это приложение работает например через командную строку.
>Опрашивая определенный параметр в коммандной
>строке приложение вызывает определенную функцию длл-ки.
>Порядок работы с длл-кой я вижу таким: моя линуховая прога вызывает
>виндовую прогу через Wine с определенным списком параметров коммандной строки.
>Виндовая прога дергает нужную функцию длл-ки
>и возвращает результат (интересно, как?).

Вполне работоспособный вариант. Проблемы будут как раз с обменом данными
между Linux-овой и Windoze-ной частями.
Можно поплясать вокруг временных файлов либо (как бы смешно это ни звучало)
вокруг сокетов семейства AF_INET.

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

Как раз это и есть невозможное дело. Употребить WineLib можно _только_
при наличии исходных кодов той части, коя с ним собирается.

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

Типичный пример отсутствия предварительного (до выбора архитектурных и, в данном
случае, алгоритмических решений) анализа направлений развития софта. Здесь можно
сказать нехилое спасибо Wine за то, что он есть. Говоря откровенно, возможность
бинарника для одной ОС функционировать в совершенно другой, реализующей
принципиально другие наборы API - большая редкость.


"Как запускать Windows dll-ку из под Linux"
Отправлено qq , 25-Июл-03 00:41 
если эта библиотека работает в основном с данными, которые ей передаются через указатели, и не использует большого количества WinAPI функций, то возможно написать свой загрузчик для нее, эмулировав минимальный набор нужных ей winapi ф-ций. Это в общем-то не так уж и проблематично, документации на формат PE и тулзов для него полно, msdn есть...

"Как запускать Windows dll-ку из под Linux"
Отправлено igor , 14-Авг-03 12:40 
>Как запускать Windows dll-ку из под Linux
Доставай уже свою dll по сети !
Вероятно как-то можно собрать всё хозяйство в кучу с помощью apache - cgi.


"Как запускать Windows dll-ку из под Linux"
Отправлено mirya , 04-Ноя-03 23:18 
  Хорошее, но очень незаконное решение (следует спросить разрешение у тех самых 3rd party programmers) - как я понял, там важен всего один алгоритм рас/запаковки. Взять SoftICE, добраться до входа в соотв. ф-цию и тупо передрать ассемблерный листинг до конца ф-ции. Еще лучше - IDA, она тебе построит дерево вызовов и с большой долей вероятности найдет границы процедуры.
  Конечно, если линуховый вариант будет ехать на другой архитектуре, прийдется попотеть (транслятор комманд одного процессора на арх. другого)