Use windows dll in linux

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Getting started — able to use a custom windows dll on linux? #35

Getting started — able to use a custom windows dll on linux? #35

Comments

My story is — I have a windows dll (a client for a web service) that I am currently using on Ubuntu with aid of Wine. This works fine-ish.

However I am interested in a more lightweight solution that can be used in containers.

I tried to get started but I’m not sure how I should use loadlibrary.

I tried:
./mpclient service_client.dll
And got:

main(): Scanning service_client.dll. EngineScanCallback(): Scanning input EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida EngineScanCallback(): Scanning archive member !Themida y 

Can you let me know if loadlibrary is able to provide a wrapper, or a way to run my dll on Linux? Any guidance is appreciated.

Читайте также:  Linux port forwarding to any port

The text was updated successfully, but these errors were encountered:

Источник

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

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

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 для упаковки файлов. От использования этого алгоритма мы отказаться не можем. Этот алгоритм является фирменным закрытым алгоритмом производителя этих компонент для Дельфи. Поэтому переписать нам этот алгоритм не получится. Я пытался найти библиотеку, реализующую этот алгоритм для Линуха. Так и не нашел 🙁

Читайте также:  Linux awk print columns

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.

Читайте также:  Linux rar password cracking

Я тут рылся в документации WineLib и насколько я понял, WineLib позволяет делать Виндовые библиотеки под Линух только при наличии исходников. У меня же исходников длл-ки нет :(.

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

Но, если другого варианта не будет, то придется так.

Источник

Can I wrap windows dll to use it in Python under Linux?

Is it possible to wrap Windows DLL (driver for specific hardware) to use it from Python under Linux. If yes, what would be the best approach?

Porting (wrapping) drivers (at least kernel mode drivers) should not work inside Linux. You’d have to have two parallel systems running in one memory sharing the same global special-meaning registers.

The short answer is: most probably not. NDISWrapper does this, but for the very specific case of network device drivers. Are you sure the device isn’t supported on Linux? Is it a USB device?

1 Answer 1

Disclaimer: Depending on the context, the following is certainly NOT the best approach. It is just ONE possible approach that kind of fits the description.

I wrote a small Python module for calling into Windows DLLs from Python on Linux. It is based on IPC between a regular Linux/Unix Python process and a Wine-based Python process. Because I have needed it in too many different use-cases / scenarios myself, I designed it as a «generic» ctypes module drop-in replacement, which does most of the required plumbing automatically in the background.

Example: Assume you’re in Python on Linux, you have Wine installed, and you want to call into msvcrt.dll (the Microsoft C runtime library). You can do the following:

from zugbruecke import 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)) 

It’s still a bit rough around the edges (i.e. alpha and insecure), but it does handle most types of parameters (including pointers).

I’d be really interested to see how it behaves and performs when used with a hardware driver. Feedback is highly welcomed!

Источник

Оцените статью
Adblock
detector