From 32e31ac7c4aa01c0c25f539d09abe8daf151b2bb Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 8 Apr 2004 04:41:14 +0000 Subject: [PATCH] Automatically detect whether the entry point is main or WinMain instead of depending on the subsystem type. --- tools/winebuild/import.c | 3 +- tools/winebuild/spec32.c | 68 +++++++++++++++++----------------------- tools/winebuild/winebuild.man.in | 9 +++--- 3 files changed, 35 insertions(+), 45 deletions(-) diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c index 187e627e030..404bce424e1 100644 --- a/tools/winebuild/import.c +++ b/tools/winebuild/import.c @@ -451,11 +451,10 @@ static void add_extra_undef_symbols( const DLLSPEC *spec ) switch (spec->subsystem) { case IMAGE_SUBSYSTEM_WINDOWS_GUI: + case IMAGE_SUBSYSTEM_WINDOWS_CUI: kernel_imports += add_extra_symbol( extras, &count, "GetCommandLineA", spec ); kernel_imports += add_extra_symbol( extras, &count, "GetStartupInfoA", spec ); kernel_imports += add_extra_symbol( extras, &count, "GetModuleHandleA", spec ); - /* fall through */ - case IMAGE_SUBSYSTEM_WINDOWS_CUI: kernel_imports += add_extra_symbol( extras, &count, "ExitProcess", spec ); break; } diff --git a/tools/winebuild/spec32.c b/tools/winebuild/spec32.c index c0233686ffb..95f180773c0 100644 --- a/tools/winebuild/spec32.c +++ b/tools/winebuild/spec32.c @@ -640,7 +640,15 @@ void BuildSpec32File( FILE *outfile, DLLSPEC *spec ) init_func = "__wine_driver_entry"; break; case IMAGE_SUBSYSTEM_WINDOWS_GUI: - if (!init_func) init_func = "WinMain"; + case IMAGE_SUBSYSTEM_WINDOWS_CUI: + if (init_func) + fprintf( outfile, "extern int %s( int argc, char *argv[] );\n", init_func ); + else + { + declare_weak_function( outfile, "main", "int main( int argc, char *argv[] )" ); + declare_weak_function( outfile, "wmain", "int wmain( int argc, unsigned short *argv[] )" ); + declare_weak_function( outfile, "WinMain", "int __stdcall WinMain(void *,void *,char *,int)" ); + } fprintf( outfile, "\ntypedef struct {\n" " unsigned int cb;\n" @@ -651,49 +659,12 @@ void BuildSpec32File( FILE *outfile, DLLSPEC *spec ) " char *lpReserved2;\n" " void *hStdInput, *hStdOutput, *hStdError;\n" "} STARTUPINFOA;\n" - "extern int __stdcall %s(void *,void *,char *,int);\n" "extern char * __stdcall GetCommandLineA(void);\n" "extern void * __stdcall GetModuleHandleA(char *);\n" "extern void __stdcall GetStartupInfoA(STARTUPINFOA *);\n" "extern void __stdcall ExitProcess(unsigned int);\n" "static void __wine_exe_main(void)\n" "{\n" - " STARTUPINFOA info;\n" - " char *cmdline = GetCommandLineA();\n" - " int ret, bcount=0, in_quotes=0;\n" - " while (*cmdline) {\n" - " if ((*cmdline=='\\t' || *cmdline==' ') && !in_quotes) break;\n" - " else if (*cmdline=='\\\\') bcount++;\n" - " else if (*cmdline=='\\\"') {\n" - " if ((bcount & 1)==0) in_quotes=!in_quotes;\n" - " bcount=0;\n" - " }\n" - " else bcount=0;\n" - " cmdline++;\n" - " }\n" - " while (*cmdline=='\\t' || *cmdline==' ') cmdline++;\n" - " GetStartupInfoA( &info );\n" - " if (!(info.dwFlags & 1)) info.wShowWindow = 1;\n" - " if (__wine_spec_init_state == 1)\n" - " _init( __wine_main_argc, __wine_main_argv, __wine_main_environ );\n" - " ret = %s( GetModuleHandleA(0), 0, cmdline, info.wShowWindow );\n" - " if (__wine_spec_init_state == 1) _fini();\n" - " ExitProcess( ret );\n" - "}\n\n", init_func, init_func ); - init_func = "__wine_exe_main"; - break; - case IMAGE_SUBSYSTEM_WINDOWS_CUI: - if (init_func) - fprintf( outfile, "extern int %s( int argc, char *argv[] );\n", init_func ); - else - { - declare_weak_function( outfile, "main", "int main( int argc, char *argv[] )" ); - declare_weak_function( outfile, "wmain", "int wmain( int argc, unsigned short *argv[] )" ); - } - fprintf( outfile, - "\nextern void __stdcall ExitProcess(int);\n" - "static void __wine_exe_main(void)\n" - "{\n" " int ret;\n" " if (__wine_spec_init_state == 1)\n" " _init( __wine_main_argc, __wine_main_argv, __wine_main_environ );\n" ); @@ -702,7 +673,26 @@ void BuildSpec32File( FILE *outfile, DLLSPEC *spec ) " ret = %s( __wine_main_argc, __wine_main_argv );\n", init_func ); else fprintf( outfile, - " if (wmain) ret = wmain( __wine_main_argc, __wine_main_wargv );\n" + " if (WinMain) {\n" + " STARTUPINFOA info;\n" + " char *cmdline = GetCommandLineA();\n" + " int bcount=0, in_quotes=0;\n" + " while (*cmdline) {\n" + " if ((*cmdline=='\\t' || *cmdline==' ') && !in_quotes) break;\n" + " else if (*cmdline=='\\\\') bcount++;\n" + " else if (*cmdline=='\\\"') {\n" + " if ((bcount & 1)==0) in_quotes=!in_quotes;\n" + " bcount=0;\n" + " }\n" + " else bcount=0;\n" + " cmdline++;\n" + " }\n" + " while (*cmdline=='\\t' || *cmdline==' ') cmdline++;\n" + " GetStartupInfoA( &info );\n" + " if (!(info.dwFlags & 1)) info.wShowWindow = 1;\n" + " ret = WinMain( GetModuleHandleA(0), 0, cmdline, info.wShowWindow );\n" + " }\n" + " else if (wmain) ret = wmain( __wine_main_argc, __wine_main_wargv );\n" " else ret = main( __wine_main_argc, __wine_main_argv );\n" ); fprintf( outfile, " if (__wine_spec_init_state == 1) _fini();\n" diff --git a/tools/winebuild/winebuild.man.in b/tools/winebuild/winebuild.man.in index 3b3a61e111e..de9a79255c1 100644 --- a/tools/winebuild/winebuild.man.in +++ b/tools/winebuild/winebuild.man.in @@ -76,11 +76,12 @@ Specify the module entry point function; if not specified, the default is .B DllMain for dlls, and -.B main -or .B WinMain -for CUI or GUI executables respectively. This is only valid for Win32 -modules. +for executables (if +.B WinMain +is not defined, the standard C +.B main +is used instead). This is only valid for Win32 modules. .TP .BI \-f\ flags Ignored for compatibility with the C compiler. -- 2.11.4.GIT