[Wine] Re: problem when use dll.so from wine app

david.nguyen wineforum-user at winehq.org
Wed Dec 17 01:49:55 CST 2008


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







More information about the wine-users mailing list