Using a windows dll from a winelib or possibly native linux
app.
Kevin Cousins
kevin at proximity.com.au
Tue Dec 9 19:14:20 CST 2003
On Tue, 2003-12-09 at 23:58, Arthur Bergman wrote:
> If we develop the app on a windows box and move it over to the wine
> environment it works, but it would be preferable to have a more native
> approach. So I tried using winelib and have progressed to a point where
> I have an application that compiles using the vendor supplied header
> files under gcc, and a vendor.dll.spec file that describes the DLL.
Well done. It took me a significant amount of effort just to get that
far in a similar project!
> However when I compile everything, the generated vendor.dll.so file
> does contain the correct symbols but they are undefined. Having played
> around using winemaker and winedump while trying to read up everything
> on winelib I am now stuck and not sure how to proceed forward.
I found a piece of WineLib documentation (sorry: I don't have an
appropriate cross-reference handy) that advocates that you write a shim
layer between your Linux code and your vendor's DLL.
Basically, regardless of how clever WineLib really is, you still can't
statically link an ELF object file against a PE COFF DLL. That's the
reason you see undefined symbols---they really are undefined! You can,
however, achieve what you want through another layer of indirection! :)
Basically, you have to define simple statically-linked definitions for
those symbols which merely call through to the dynamically linked
versions contained in your vendor's DLL. It works like this:
* the vendor's DLL exports some function
ReturnType FunctionName(ParameterType)
* you've got to write your own module that wraps this:
#include <windows.h>
#include <vendor_dll.h>
static ReturnType (*FunctionName_pointer) (ParameterType);
void InitialiseVendorDLL() { /* BE SURE TO CALL THIS SOMEWHERE EARLY */
HINSTANCE dll;
dll = LoadLibrary("vendor.dll"); /* N.B. ADD YOUR OWN ERROR CHECKING */
FunctionName_pointer = GetProcAddress(dll, "FunctionName");
}
ReturnType FunctionName(ParameterType p) {
return FunctionName_pointer(p);
}
Compile and link against /that/ (or similar specialised for your
particular situation), and you're undefined symbols will now have a
definition, and your code should work as advertised. At the very least,
all this worked for me!
> Thanks
You're welcome.
Please let me know how you get along with this.
> Arthur
--
Kevin.
More information about the wine-devel
mailing list