- How to replace Windows DLL with Wine DLL
- Как запускать Windows dll-ку из под Linux
- Re: Как запускать Windows dll-ку из под Linux
- Re: Как запускать Windows dll-ку из под Linux
- Re: Как запускать Windows dll-ку из под Linux
- Re: Как запускать Windows dll-ку из под Linux
- Re: Как запускать Windows dll-ку из под Linux
- Re: Как запускать Windows dll-ку из под Linux
- Re: Как запускать Windows dll-ку из под Linux
- Re: Как запускать Windows dll-ку из под Linux
How to replace Windows DLL with Wine DLL
This article describes tips for building a DLL for Windows applications running under Wine on Linux. Although many Windows applications will run fine with the original Windows DLLs, some may require parts of them to be adapted to Linux. Here you will find some tips on how to implement a DLL, which replaces the original DLL, and calls native Linux API functions and libraries.
In my specific case I wanted to run a Windows application on Linux. Everything worked fine with Wine, but hardware attached to USB could not be accessed because there is no support for Windows drivers in Wine. So I decided to replace the application’s Windows DLL for USB communication with Wine DLL, which uses native Linux library.
I had application’s sources available. If you don»t have them, a good DLL documentation with function declarations is a must.
Since there are other pages available which describe the procedure, this page emphasizes the information which I did not find elsewhere, but turned out to be important.
This piece of information is very important — find out what is the calling convention for your DLL. If you are going to replace a DLL, which is a part of Windows API, then the __stdcall calling convention is used. If you are going to replace a custom DLL, which comes with an application, then exported functions may be compiled with __stdcall or __cdecl calling convention. If you don’t have source code, then you’ll need good documentation for exported functions. If this piece of information is missing, you can try it first with one calling convention and then the other. If one works and the other one crashes application, you know which one is right.
Note: Functions without parameters work with both calling conventions, so test it on functions with parameters.
As described in the next steps of this tutorial, calling convention is specified in spec file. If the standard calling convention is used, you must also specify it in C code.
Tip: If you have sources, it is easy to find out the calling convention. If macros are used for function
declarations and you are not sure how do they expand, replace gcc option -o objFile> with option -E and the preprocessed source will be printed to stdout.
Spec files are needed for building a Wine DLL. You can write one manually, or use the winedump utilty to generate it. In this section we’ll create a spec file for the following exported functions:
DWORD usbOpenUSB(const char *fName, int usbNumber);
DWORD usbOpenLog(const char *fName);
DWORD usbLog(const char *text);
DWORD usbLogLn(const char *text);
Creating the spec file manually
If you don’t like the generated file or would like to understand it, look into man page on the web or type:
man winebuild
and scroll down a few screens.
Example of the spec file contents:
In this example the __cdecl calling convention is used.
Generating the spec file
For succesful generation of the spec file and C sources, the winedump utility requires the Windows DLL binary and C source code with function headers (either H or C files). The folder with sources must be specified with the -I option. This option is mandatory for source generation. In the following example we have source files in the current directory (option -I . is used), and we want to TRACE arguments (option -t). We know that the original DLL is using C calling convention (option -C):
winedump spec mycalc.dll -I . -t -C
What we’ve got is a good starting point! For other options of the utility type man winedump.
— Source of the original dll
— C source and header files
Как запускать 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 для упаковки файлов. От использования этого алгоритма мы отказаться не можем. Этот алгоритм является фирменным закрытым алгоритмом производителя этих компонент для Дельфи. Поэтому переписать нам этот алгоритм не получится. Я пытался найти библиотеку, реализующую этот алгоритм для Линуха. Так и не нашел 🙁
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 сразу, это позволит использовать большое кол-во >виндузячих функций, а так же сетевую поддержку. Звучит сложно.
Но, если другого варианта не будет, то придется так.