Sorry, I hit send by mistake. Here is the entire message.
Hi,
I wrote to the list a few weeks ago. I needed to support a USB device without changing the Windows dll that I have to use. I was trying to hack into wine to implement support for the USB device using CreateFile() and DeviceIoControl(). That was not a clean solution.
The author of the Windows dll has agreed to support a mid level dll that would implement functions like USBDeviceOpen(), USBDeviceClose(), USBDeviceRead(), and USBDeviceWrite(). On Windows those would use CreateFile() and DeviceIoControl(), while on Linux they would use libusb calls.
I followed the example from the winelib user guide, chapter 5 "Using Linux libraries as DLLs" As an example I will talk just about USBDeviceOpen(). Here it is how it is declared together with a proxy function:
HANDLE WINAPI USBDeviceOpen(const DWORD in_dwIndex); HANDLE WINAPI USBDeviceOpenProxy(const DWORD in_dwIndex);
This function opens a specific device from a specific manufacturer. If more than one device is connected, the index will specify which device to open.
In the spec file I put:
101 stdcall USBDeviceOpen (long) USBDeviceOpenProxy
I used winemaker, configure, make, and make install. Now I have "USBUtils.dll.so in /usr/lib/wine.
I wrote a small test program. It has a WinMain function and it calls USBDeviceOpen. I used winemaker again and I am running the test application this way:
# wine -- test.exe.so
If I call USBDeviceOpenProxy (or any other proxy function), the test application links and runs correctly. I tested all functions and they work as expected.
But, if I call USBDeviceOpen, the application does not link (undefined USBDeviceOpen). If I use the C compiler (instead of C++) the application links, but at runtime it does not find USBDeviceOpen.
I don't understand how Windows dlls and Linux libraries link and how functions are called. What am I missing?
I would appreciate any help.
Dan Timis Muse Research, Inc.