Thank you very much,
I had try the same way that you say but still not work the same error
Following is my windows dll
1. Simple.h:
Code:
__declspec(dllexport) void ShowText()
2. Simple.c
Code:
#include "Simple.h"
#include <stdio.h>
void ShowText()
{
printf("Hello world\n");
}
i build and generate Simple.dll
3. install wine and copy Simple.dll to my folder on linux system
4. use winedump to general .spec, .c, .h
> winedump spec Simple.dll -f Simple -I "*.h"
=>Simple.spec, Simple_main.c, Simple_dll.h
- Simple.spec content:
Code:
# Generated from Simple.dll by winedump
1 cdecl ?ShowText@@YAXXZ() SIMPLE_global_ShowText_1
#import Simple.dll
- Simple_dll.h content:
Code:
/*
* Simple.dll
*
* Generated from Simple.dll by winedump.
*
* DO NOT SEND GENERATED DLLS FOR INCLUSION INTO WINE !
*
*/
#ifndef __WINE_SIMPLE_DLL_H
#define __WINE_SIMPLE_DLL_H
#include "windef.h"
#include "wine/debug.h"
#include "winbase.h"
#include "winnt.h"
void __cdecl SIMPLE_global_ShowText_1(void);
#endif /* __WINE_SIMPLE_DLL_H */
- Simple_main.c content:
Code:
/*
* Simple.dll
*
* Generated from Simple.dll by winedump.
*
* DO NOT SUBMIT GENERATED DLLS FOR INCLUSION INTO WINE!
*
*/
//#include "config.h"
#define __WINESRC__
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "Simple_dll.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(Simple);
HMODULE hDLL=0; /* DLL to call */
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved);
switch (fdwReason)
{
case DLL_WINE_PREATTACH:
return FALSE; /* prefer native version */
case DLL_PROCESS_ATTACH:
hDLL = LoadLibraryA("Simple");
TRACE("Forwarding DLL (Simple) loaded (%p)\n", hDLL);
break;
case DLL_PROCESS_DETACH:
FreeLibrary(hDLL);
TRACE("Forwarding DLL (Simple) freed\n");
break;
default:
break;
}
return TRUE;
}
/******************************************************************
* ?ShowText@@YAXXZ (SIMPLE.1)
*
*
*/
void __cdecl SIMPLE_global_ShowText_1(void)
{
void (__cdecl *pFunc)(void);
pFunc=(void*)GetProcAddress(hDLL,"?ShowText@@YAXXZ");
TRACE("(void): forward\n");
pFunc();
TRACE("Returned (void)\n");
}
/******************************************************************
* ?ShowTextA@@YAXXZ (SIMPLE.2)
*
*
*/
void __cdecl SIMPLE_global_ShowTextA_2(void)
{
void (__cdecl *pFunc)(void);
pFunc=(void*)GetProcAddress(hDLL,"?ShowTextA@@YAXXZ");
TRACE("(void): forward\n");
pFunc();
TRACE("Returned (void)\n");
}
5. use winegcc to build libSimple.dll.so
> winegcc Simple_main.c Simple.spec -o libSimple -shared -fPIC
=> libSimple.dll.so
6. write test program main.c:
Code:
#include "Simple_dll.h"
int main(int argc, char **argv) {
SIMPLE_global_ShowText_1();
return 0;
}
7. use winegcc to build it by command line such as you say but still not work:
> winegcc -Bwinebuild -I/usr/include/wine -I/usr/lib/wine -mwindows main.c -o
main -lSimple.dll -luser32 -lkernel32
My process is correct?
Thank you very much