diff --git a/dlls/msvcrt/data.c b/dlls/msvcrt/data.c index 390395fb5fd..842ff152fce 100644 --- a/dlls/msvcrt/data.c +++ b/dlls/msvcrt/data.c @@ -27,7 +27,7 @@ #include "msvcrt/stdlib.h" #include "msvcrt/string.h" - +#include "wine/library.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(msvcrt); @@ -158,9 +158,6 @@ static WCHAR *wstrdupa(const char *str) return wstr; } -extern int __wine_get_main_args(char*** argv); -extern int __wine_get_wmain_args(WCHAR*** argv); - /* INTERNAL: Since we can't rely on Winelib startup code calling w/getmainargs, * we initialise data values during DLL loading. When called by a native * program we simply return the data we've already initialised. This also means @@ -175,8 +172,9 @@ void msvcrt_init_args(void) MSVCRT__acmdln = _strdup( GetCommandLineA() ); MSVCRT__wcmdln = wstrdupa(MSVCRT__acmdln); - MSVCRT___argc = __wine_get_main_args(&MSVCRT___argv); - __wine_get_wmain_args(&MSVCRT___wargv); + MSVCRT___argc = __wine_main_argc; + MSVCRT___argv = __wine_main_argv; + MSVCRT___wargv = __wine_main_wargv; TRACE("got '%s', wide = %s argc=%d\n", MSVCRT__acmdln, debugstr_w(MSVCRT__wcmdln),MSVCRT___argc); diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 5e46d88bd9c..74d66ad020d 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -1029,10 +1029,6 @@ name ntdll @ varargs wine_dbg_printf(str) wine_dbg_printf @ varargs wine_dbg_log(long str str str) wine_dbg_log -# Command-line -@ cdecl __wine_get_main_args(ptr) __wine_get_main_args -@ cdecl __wine_get_wmain_args(ptr) __wine_get_wmain_args - # Server interface @ cdecl -norelay wine_server_call(ptr) wine_server_call @ cdecl wine_server_handle_to_fd(long long ptr ptr ptr) wine_server_handle_to_fd diff --git a/include/wine/library.h b/include/wine/library.h index cc8cfe00c43..4b3eee2717c 100644 --- a/include/wine/library.h +++ b/include/wine/library.h @@ -37,6 +37,10 @@ extern void *wine_dll_load_main_exe( const char *name, int search_path, char *error, int errorsize ); extern void wine_dll_unload( void *handle ); +extern int __wine_main_argc; +extern char **__wine_main_argv; +extern WCHAR **__wine_main_wargv; + /* debugging */ extern void wine_dbg_add_option( const char *name, unsigned char set, unsigned char clear ); diff --git a/library/loader.c b/library/loader.c index bedab96526b..10352c4bfb5 100644 --- a/library/loader.c +++ b/library/loader.c @@ -34,6 +34,11 @@ #include "winnt.h" #include "wine/library.h" +/* argc/argv for the Windows application */ +int __wine_main_argc = 0; +char **__wine_main_argv = NULL; +WCHAR **__wine_main_wargv = NULL; + #define MAX_DLLS 100 static struct diff --git a/memory/environ.c b/memory/environ.c index de8674d3e48..b682f1dc9ec 100644 --- a/memory/environ.c +++ b/memory/environ.c @@ -29,6 +29,7 @@ #include "wine/winbase16.h" #include "wine/server.h" +#include "wine/library.h" #include "heap.h" #include "ntddk.h" #include "selectors.h" @@ -278,6 +279,40 @@ ENVDB *ENV_InitStartupInfo( handle_t info_handle, size_t info_size, } + +/*********************************************************************** + * set_library_argv + * + * Set the Wine library argc/argv global variables. + */ +static void set_library_argv( char **argv ) +{ + int argc; + WCHAR *p; + WCHAR **wargv; + DWORD total = 0; + + for (argc = 0; argv[argc]; argc++) + total += MultiByteToWideChar( CP_ACP, 0, argv[argc], -1, NULL, 0 ); + + wargv = HeapAlloc( GetProcessHeap(), 0, + total * sizeof(WCHAR) + (argc + 1) * sizeof(*wargv) ); + p = (WCHAR *)(wargv + argc + 1); + for (argc = 0; argv[argc]; argc++) + { + DWORD len = MultiByteToWideChar( CP_ACP, 0, argv[argc], -1, p, total ); + wargv[argc] = p; + p += len; + total -= len; + } + wargv[argc] = NULL; + + __wine_main_argc = argc; + __wine_main_argv = argv; + __wine_main_wargv = wargv; +} + + /*********************************************************************** * ENV_BuildCommandLine * @@ -305,6 +340,8 @@ BOOL ENV_BuildCommandLine( char **argv ) int len; char *p, **arg; + set_library_argv( argv ); + if (current_envdb.cmd_line) goto done; /* already got it from the server */ len = 0; diff --git a/scheduler/process.c b/scheduler/process.c index 0d974f9a79e..e29d617f715 100644 --- a/scheduler/process.c +++ b/scheduler/process.c @@ -109,9 +109,6 @@ PDB current_process; #define PDB32_FILE_APIS_OEM 0x0040 /* File APIs are OEM */ #define PDB32_WIN32S_PROC 0x8000 /* Win32s process */ -static int app_argc; /* argc/argv seen by the application */ -static char **app_argv; -static WCHAR **app_wargv; static char main_exe_name[MAX_PATH]; static char *main_exe_name_ptr = main_exe_name; static HANDLE main_exe_file; @@ -252,7 +249,6 @@ static BOOL process_init( char *argv[] ) /* store the program name */ argv0 = argv[0]; - app_argv = argv; /* Fill the initial process structure */ current_process.exit_code = STILL_ACTIVE; @@ -320,8 +316,6 @@ static BOOL process_init( char *argv[] ) /* Parse command line arguments */ OPTIONS_ParseOptions( !info ? argv : NULL ); - app_argc = 0; - while (argv[app_argc]) app_argc++; ret = MAIN_MainInit(); @@ -489,20 +483,19 @@ void PROCESS_InitWine( int argc, char *argv[], LPSTR win16_exe_name, HANDLE *win /* Initialize everything */ if (!process_init( argv )) exit(1); - if (open_winelib_app( app_argv )) goto found; /* try to open argv[0] as a winelib app */ + if (open_winelib_app( argv )) goto found; /* try to open argv[0] as a winelib app */ - app_argv++; /* remove argv[0] (wine itself) */ - app_argc--; + argv++; /* remove argv[0] (wine itself) */ if (!main_exe_name[0]) { - if (!app_argv[0]) OPTIONS_Usage(); + if (!argv[0]) OPTIONS_Usage(); /* open the exe file */ - if (!SearchPathA( NULL, app_argv[0], ".exe", sizeof(main_exe_name), main_exe_name, NULL) && - !SearchPathA( NULL, app_argv[0], NULL, sizeof(main_exe_name), main_exe_name, NULL)) + if (!SearchPathA( NULL, argv[0], ".exe", sizeof(main_exe_name), main_exe_name, NULL) && + !SearchPathA( NULL, argv[0], NULL, sizeof(main_exe_name), main_exe_name, NULL)) { - MESSAGE( "%s: cannot find '%s'\n", argv0, app_argv[0] ); + MESSAGE( "%s: cannot find '%s'\n", argv0, argv[0] ); goto error; } } @@ -536,7 +529,7 @@ void PROCESS_InitWine( int argc, char *argv[], LPSTR win16_exe_name, HANDLE *win found: /* build command line */ - if (!ENV_BuildCommandLine( app_argv )) goto error; + if (!ENV_BuildCommandLine( argv )) goto error; /* create 32-bit module for main exe */ if (!(current_process.module = BUILTIN32_LoadExeModule( current_process.module ))) goto error; @@ -553,52 +546,6 @@ void PROCESS_InitWine( int argc, char *argv[], LPSTR win16_exe_name, HANDLE *win } -/*********************************************************************** - * __wine_get_main_args (NTDLL.@) - * - * Return the argc/argv that the application should see. - * Used by the startup code generated in the .spec.c file. - */ -int __wine_get_main_args( char ***argv ) -{ - *argv = app_argv; - return app_argc; -} - - -/*********************************************************************** - * __wine_get_wmain_args (NTDLL.@) - * - * Same as __wine_get_main_args but for Unicode. - */ -int __wine_get_wmain_args( WCHAR ***argv ) -{ - if (!app_wargv) - { - int i; - WCHAR *p; - DWORD total = 0; - - for (i = 0; i < app_argc; i++) - total += MultiByteToWideChar( CP_ACP, 0, app_argv[i], -1, NULL, 0 ); - - app_wargv = HeapAlloc( GetProcessHeap(), 0, - total * sizeof(WCHAR) + (app_argc + 1) * sizeof(*app_wargv) ); - p = (WCHAR *)(app_wargv + app_argc + 1); - for (i = 0; i < app_argc; i++) - { - DWORD len = MultiByteToWideChar( CP_ACP, 0, app_argv[i], -1, p, total ); - app_wargv[i] = p; - p += len; - total -= len; - } - app_wargv[app_argc] = NULL; - } - *argv = app_wargv; - return app_argc; -} - - /*********************************************************************** * build_argv *