Problems converting DLL to unix SO with winelib

List vmn list at vmn.com.br
Tue Jun 11 11:20:22 CDT 2002


Hello Wine-devel,

I finaly got the expected results from my simple tests to get a winelib DLL 
and test application
to work.

I am pretty sure that I am still doing something wrong in these tests !!!!!

Can somebody say if the below setup is correct and if not what would
be the correct way to create a winelib "dll" and then call it from a 
winelib executable.

I am using wine-20020509.


=>I start with a simple DLL file called mytest.c and use winemaker to 
create a libmytest.so

bash#cd ~/mytest.dll
bash#ls
mytest.c
bash#cat mytest.c

//mytest.c
#include <windows.h>
#include <stdio.h>

BOOL APIENTRY DllMain(HINSTANCE  hinstDLL , DWORD fdwReason, 
LPVOID  lpvReserved
  ) {
         printf("DllMain called\n");
         return TRUE;
}


void usefullFunction() {
         printf("Usefull function got called\n");
}
//end of mytest.c

bash#winemaker --dll --nomfc .
<output suppressed>
bash#cat libmytest.spec
name    mytest
type    win32
mode    dll
init    DllMain

import kernel32.dll
import ntdll.dll


bash# ./configure
<output suppressed>

bash# make && make install
gcc -c -g -O2 -fPIC  -D_REENTRANT -DWINELIB  -I.  -I/usr/local/include/wine 
-o mytest.o mytest.c
ld -r mytest.o   -o libmytest.tmp.o
strip --strip-unneeded libmytest.tmp.o
LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH" /usr/local/bin/winebuild 
-fPIC  -L/usr/local/lib/wine -sym libmytest.tmp.o -o libmytest.spec.c -spec 
./libmytest.spec
gcc -c -g -O2 -fPIC  -D_REENTRANT -DWINELIB  -I.  -I/usr/local/include/wine 
-o libmytest.spec.o libmytest.spec.c
gcc -shared -Wl,-rpath,/usr/local/lib -Wl,-Bsymbolic -o libmytest.so 
mytest.o   libmytest.spec.o      -lwine -lwine_unicode -lwine_uuid -lm
_list=""; for i in $_list; do (cd $i; make install) || exit 1; done
_list=" "; for i in $_list; do install $i /usr/local/bin; done
_list="libmytest.so"; for i in $_list; do install $i /usr/local/lib; done

bash#   #Now I have a /usr/local/lib/libmytest.so file \
         #I think the next commands are wrong...

bash#  cd /usr/local/lib
bash#  cp libmytest.so wine/mytest.dll.so
bash#  ln -s wine/mytest.dll.so libmytest.dll.so

bash#   #This was done so that I can write \
                 # import mytest.dll \
                 # in a spec file and "register with wine" this so


=>I now create a simple winelib application to call mytest called "callmytest"
=>Call my test is defined in callmytest.c

bash# cd ~/callmytest
bash#ls
callmytest.c
bash# cat callmytest.c
//start of callmytest.c
#include "windows.h"

extern usefullFunction();

int WINAPI WinMain(HINSTANCE a,HINSTANCE b,LPSTR c ,int d) {
usefullFunction();
}

//end of callmytest.c

bash# winemaker --guiexe -imytest.dll -lmytest.dll .
<output suppressed>

bash# cat callmytest.spec
name    callmytest
type    win32
mode    guiexe
init    WinMain

import kernel32.dll
import ntdll.dll
import mytest.dll

bash# ./configure
<output suppressed>

bash# make
gcc -c -g -O2 -fPIC  -D_REENTRANT -DWINELIB  -I.  -I/usr/local/include/wine 
-o callmytest.o callmytest.c
ld -r callmytest.o   -o callmytest.tmp.o
strip --strip-unneeded callmytest.tmp.o
LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH" /usr/local/bin/winebuild 
-fPIC  -L/usr/local/lib/wine -sym callmytest.tmp.o -o callmytest.spec.c 
-spec ./callmytest.spec
gcc -c -g -O2 -fPIC  -D_REENTRANT -DWINELIB  -I.  -I/usr/local/include/wine 
-o callmytest.spec.o callmytest.spec.c
gcc -shared -Wl,-rpath,/usr/local/lib -Wl,-Bsymbolic -o callmytest.so 
callmytest.o   callmytest.spec.o    -lmytest.dll  -lwine -lwine_unicode 
-lwine_uuid -lm
test -f callmytest || ln -s /usr/local/bin/wine callmytest

bash# ./callmytest
DllMain called
Usefull function got called
DllMain called


QUESTION 1:
I think that adding  -imytest.dll -lmytest.dll to

winemaker --guiexe -imytest.dll -lmytest.dll .

is wrong.

QUESTION 2:
Is DllMain called when the DLL is loaded and then unloaded ?

Can anyone help me on this?

Thanks,
Miguel Feitosa




More information about the wine-devel mailing list