| /* | |
| * Emulator initialisation code | |
| * | |
| * Copyright 2000 Alexandre Julliard | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| */ | |
| #include "winbase.h" | |
| #include "wine/winbase16.h" | |
| #include "wingdi.h" | |
| #include "winuser.h" | |
| #include "miscemu.h" | |
| #include "callback.h" | |
| #include "options.h" | |
| #include "wine/debug.h" | |
| static char main_exe_name[MAX_PATH]; | |
| static HANDLE main_exe_file; | |
| static BOOL (WINAPI *pGetMessageA)(LPMSG,HWND,UINT,UINT); | |
| static BOOL (WINAPI *pTranslateMessage)(const MSG*); | |
| static LONG (WINAPI *pDispatchMessageA)(const MSG*); | |
| extern void DECLSPEC_NORETURN PROCESS_InitWine( | |
| int argc, char *argv[], LPSTR win16_exe_name, | |
| HANDLE *win16_exe_file ); | |
| extern HINSTANCE16 NE_StartMain( LPCSTR name, HANDLE file ); | |
| /*********************************************************************** | |
| * Main loop of initial task | |
| */ | |
| int WINAPI wine_initial_task( HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, INT show ) | |
| { | |
| MSG msg; | |
| HINSTANCE16 instance; | |
| HMODULE user32; | |
| /* some programs assume mmsystem is always present */ | |
| LoadLibrary16( "mmsystem.dll" ); | |
| if ((instance = NE_StartMain( main_exe_name, main_exe_file )) < 32) | |
| { | |
| if (instance == 11) /* try DOS format */ | |
| { | |
| if (DPMI_LoadDosSystem()) | |
| Dosvm.LoadDosExe( main_exe_name, main_exe_file ); | |
| /* if we get back here it failed */ | |
| instance = GetLastError(); | |
| } | |
| MESSAGE( "%s: can't exec '%s': ", argv0, GetCommandLineA() ); | |
| switch (instance) | |
| { | |
| case 2: MESSAGE("file not found\n" ); break; | |
| case 11: MESSAGE("invalid exe file\n" ); break; | |
| default: MESSAGE("error=%d\n", instance ); break; | |
| } | |
| ExitProcess(instance); | |
| } | |
| CloseHandle( main_exe_file ); /* avoid file sharing problems */ | |
| /* Start message loop for desktop window */ | |
| if (!(user32 = LoadLibraryA( "user32.dll" ))) | |
| { | |
| MESSAGE( "Cannot load user32.dll\n" ); | |
| ExitProcess( GetLastError() ); | |
| } | |
| pGetMessageA = (void *)GetProcAddress( user32, "GetMessageA" ); | |
| pTranslateMessage = (void *)GetProcAddress( user32, "TranslateMessage" ); | |
| pDispatchMessageA = (void *)GetProcAddress( user32, "DispatchMessageA" ); | |
| while ( GetNumTasks16() > 1 && pGetMessageA( &msg, 0, 0, 0 ) ) | |
| { | |
| pTranslateMessage( &msg ); | |
| pDispatchMessageA( &msg ); | |
| } | |
| ExitProcess( 0 ); | |
| } | |
| /********************************************************************** | |
| * main | |
| */ | |
| int main( int argc, char *argv[] ) | |
| { | |
| PROCESS_InitWine( argc, argv, main_exe_name, &main_exe_file ); | |
| return 1; /* not reached */ | |
| } |