Removed a few Callout functions by doing a GetProcAddress at the time

we actually need the function.
This commit is contained in:
Alexandre Julliard 2001-02-20 00:55:17 +00:00
parent fe5b19d15b
commit ea2a9a8974
7 changed files with 86 additions and 71 deletions

View File

@ -28,7 +28,6 @@
#include "winnt.h" #include "winnt.h"
#include "wincon.h" #include "wincon.h"
#include "callback.h"
#include "msdos.h" #include "msdos.h"
#include "file.h" #include "file.h"
#include "miscemu.h" #include "miscemu.h"
@ -426,13 +425,13 @@ void WINAPI DOSVM_Wait( INT read_pipe, HANDLE hObject )
objc=hObject?2:1; objc=hObject?2:1;
do { do {
/* check for messages (waste time before the response check below) */ /* check for messages (waste time before the response check below) */
if (Callout.PeekMessageA) if (PeekMessageA)
{ {
while (Callout.PeekMessageA(&msg,0,0,0,PM_REMOVE|PM_NOYIELD)) { while (PeekMessageA(&msg,0,0,0,PM_REMOVE|PM_NOYIELD)) {
/* got a message */ /* got a message */
DOSVM_ProcessMessage(&msg); DOSVM_ProcessMessage(&msg);
/* we don't need a TranslateMessage here */ /* we don't need a TranslateMessage here */
Callout.DispatchMessageA(&msg); DispatchMessageA(&msg);
got_msg = TRUE; got_msg = TRUE;
} }
} }
@ -465,8 +464,8 @@ chk_console_input:
break; break;
} }
/* nothing yet, block while waiting for something to do */ /* nothing yet, block while waiting for something to do */
if (Callout.MsgWaitForMultipleObjects) if (MsgWaitForMultipleObjects)
waitret = Callout.MsgWaitForMultipleObjects(objc,objs,FALSE,INFINITE,QS_ALLINPUT); waitret = MsgWaitForMultipleObjects(objc,objs,FALSE,INFINITE,QS_ALLINPUT);
else else
waitret = WaitForMultipleObjects(objc,objs,FALSE,INFINITE); waitret = WaitForMultipleObjects(objc,objs,FALSE,INFINITE);

View File

@ -37,23 +37,13 @@ extern WORD CALLBACK THUNK_CallTo16_word_wwwl (FARPROC16,WORD,WORD,WORD,LONG);
static THUNK *firstThunk = NULL; static THUNK *firstThunk = NULL;
CALLOUT_TABLE Callout = { CALLOUT_TABLE Callout = {
/* PeekMessageA */ NULL,
/* GetMessageA */ NULL,
/* SendMessageA */ NULL,
/* PostMessageA */ NULL, /* PostMessageA */ NULL,
/* TranslateMessage */ NULL,
/* DispatchMessageA */ NULL,
/* RedrawWindow */ NULL,
/* UserSignalProc */ NULL, /* UserSignalProc */ NULL,
/* FinalUserInit16 */ NULL, /* FinalUserInit16 */ NULL,
/* InitThreadInput16 */ NULL, /* InitThreadInput16 */ NULL,
/* UserYield16) */ NULL, /* UserYield16) */ NULL,
/* DestroyIcon32 */ NULL, /* DestroyIcon32 */ NULL,
/* WaitForInputIdle */ NULL, /* WaitForInputIdle */ NULL
/* MsgWaitForMultipleObjects */ NULL,
/* WindowFromDC */ NULL,
/* MessageBoxA */ NULL,
/* MessageBoxW */ NULL
}; };
/*********************************************************************** /***********************************************************************
@ -171,18 +161,8 @@ void THUNK_InitCallout(void)
#define GETADDR( name ) \ #define GETADDR( name ) \
*(FARPROC *)&Callout.name = GetProcAddress( hModule, #name ) *(FARPROC *)&Callout.name = GetProcAddress( hModule, #name )
GETADDR( PeekMessageA );
GETADDR( GetMessageA );
GETADDR( SendMessageA );
GETADDR( PostMessageA ); GETADDR( PostMessageA );
GETADDR( TranslateMessage );
GETADDR( DispatchMessageA );
GETADDR( RedrawWindow );
GETADDR( WaitForInputIdle ); GETADDR( WaitForInputIdle );
GETADDR( MsgWaitForMultipleObjects );
GETADDR( WindowFromDC );
GETADDR( MessageBoxA );
GETADDR( MessageBoxW );
#undef GETADDR #undef GETADDR
} }
else WARN("no 32-bit USER\n"); else WARN("no 32-bit USER\n");

View File

@ -23,23 +23,13 @@ extern void THUNK_InitCallout(void);
typedef struct typedef struct
{ {
BOOL WINAPI (*PeekMessageA)( LPMSG, HWND, UINT, UINT, UINT );
BOOL WINAPI (*GetMessageA)( MSG*, HWND, UINT, UINT );
LRESULT WINAPI (*SendMessageA)( HWND, UINT, WPARAM, LPARAM );
BOOL WINAPI (*PostMessageA)( HWND, UINT, WPARAM, LPARAM ); BOOL WINAPI (*PostMessageA)( HWND, UINT, WPARAM, LPARAM );
BOOL WINAPI (*TranslateMessage)( const MSG *msg );
LONG WINAPI (*DispatchMessageA)( const MSG* msg );
BOOL WINAPI (*RedrawWindow)( HWND, const RECT *, HRGN, UINT );
WORD WINAPI (*UserSignalProc)( UINT, DWORD, DWORD, HMODULE16 ); WORD WINAPI (*UserSignalProc)( UINT, DWORD, DWORD, HMODULE16 );
void WINAPI (*FinalUserInit16)( void ); void WINAPI (*FinalUserInit16)( void );
HQUEUE16 WINAPI (*InitThreadInput16)( WORD, WORD ); HQUEUE16 WINAPI (*InitThreadInput16)( WORD, WORD );
void WINAPI (*UserYield16)( void ); void WINAPI (*UserYield16)( void );
WORD WINAPI (*DestroyIcon32)( HGLOBAL16, UINT16 ); WORD WINAPI (*DestroyIcon32)( HGLOBAL16, UINT16 );
DWORD WINAPI (*WaitForInputIdle)( HANDLE, DWORD ); DWORD WINAPI (*WaitForInputIdle)( HANDLE, DWORD );
DWORD WINAPI (*MsgWaitForMultipleObjects)( DWORD, HANDLE *, BOOL, DWORD, DWORD );
HWND WINAPI (*WindowFromDC)( HDC );
INT WINAPI (*MessageBoxA)( HWND, LPCSTR, LPCSTR, UINT );
INT WINAPI (*MessageBoxW)( HWND, LPCWSTR, LPCWSTR, UINT );
} CALLOUT_TABLE; } CALLOUT_TABLE;
extern CALLOUT_TABLE Callout; extern CALLOUT_TABLE Callout;

View File

@ -1573,6 +1573,8 @@ BOOL16 WINAPI TaskFindHandle16( TASKENTRY *lpte, HTASK16 hTask )
} }
typedef INT (WINAPI *MessageBoxA_funcptr)(HWND hWnd, LPCSTR text, LPCSTR title, UINT type);
/************************************************************************** /**************************************************************************
* FatalAppExit16 (KERNEL.137) * FatalAppExit16 (KERNEL.137)
*/ */
@ -1582,11 +1584,19 @@ void WINAPI FatalAppExit16( UINT16 action, LPCSTR str )
if (!pTask || !(pTask->error_mode & SEM_NOGPFAULTERRORBOX)) if (!pTask || !(pTask->error_mode & SEM_NOGPFAULTERRORBOX))
{ {
if (Callout.MessageBoxA) HMODULE mod = GetModuleHandleA( "user32.dll" );
Callout.MessageBoxA( 0, str, NULL, MB_SYSTEMMODAL | MB_OK ); if (mod)
else {
ERR( "%s\n", debugstr_a(str) ); MessageBoxA_funcptr pMessageBoxA = (MessageBoxA_funcptr)GetProcAddress( mod, "MessageBoxA" );
if (pMessageBoxA)
{
pMessageBoxA( 0, str, NULL, MB_SYSTEMMODAL | MB_OK );
goto done;
}
}
ERR( "%s\n", debugstr_a(str) );
} }
done:
ExitThread(0xff); ExitThread(0xff);
} }

View File

@ -17,6 +17,10 @@
static char main_exe_name[MAX_PATH]; static char main_exe_name[MAX_PATH];
static HANDLE main_exe_file; 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 PROCESS_InitWine( int argc, char *argv[], LPSTR win16_exe_name, extern void PROCESS_InitWine( int argc, char *argv[], LPSTR win16_exe_name,
HANDLE *win16_exe_file ) WINE_NORETURN; HANDLE *win16_exe_file ) WINE_NORETURN;
extern HINSTANCE16 NE_StartMain( LPCSTR name, HANDLE file ); extern HINSTANCE16 NE_StartMain( LPCSTR name, HANDLE file );
@ -28,12 +32,16 @@ int WINAPI wine_initial_task( HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, INT
{ {
MSG msg; MSG msg;
HINSTANCE16 instance; HINSTANCE16 instance;
HMODULE user32;
if (!LoadLibraryA( "user32.dll" )) if (!(user32 = LoadLibraryA( "user32.dll" )))
{ {
MESSAGE( "Cannot load user32.dll\n" ); MESSAGE( "Cannot load user32.dll\n" );
ExitProcess( GetLastError() ); ExitProcess( GetLastError() );
} }
pGetMessageA = (void *)GetProcAddress( user32, "GetMessageA" );
pTranslateMessage = (void *)GetProcAddress( user32, "TranslateMessage" );
pDispatchMessageA = (void *)GetProcAddress( user32, "DispatchMessageA" );
THUNK_InitCallout(); THUNK_InitCallout();
if ((instance = NE_StartMain( main_exe_name, main_exe_file )) < 32) if ((instance = NE_StartMain( main_exe_name, main_exe_file )) < 32)
@ -59,10 +67,10 @@ int WINAPI wine_initial_task( HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, INT
/* Start message loop for desktop window */ /* Start message loop for desktop window */
while ( GetNumTasks16() > 1 && Callout.GetMessageA( &msg, 0, 0, 0 ) ) while ( GetNumTasks16() > 1 && pGetMessageA( &msg, 0, 0, 0 ) )
{ {
Callout.TranslateMessage( &msg ); pTranslateMessage( &msg );
Callout.DispatchMessageA( &msg ); pDispatchMessageA( &msg );
} }
ExitProcess( 0 ); ExitProcess( 0 );

View File

@ -19,7 +19,6 @@
#include "color.h" #include "color.h"
#include "palette.h" #include "palette.h"
#include "debugtools.h" #include "debugtools.h"
#include "callback.h"
#include "winerror.h" #include "winerror.h"
DEFAULT_DEBUG_CHANNEL(palette); DEFAULT_DEBUG_CHANNEL(palette);
@ -775,28 +774,40 @@ UINT WINAPI RealizePalette(
} }
typedef HWND WINAPI (*WindowFromDC_funcptr)( HDC );
typedef BOOL WINAPI (*RedrawWindow_funcptr)( HWND, const RECT *, HRGN, UINT );
/********************************************************************** /**********************************************************************
* UpdateColors16 (DISPLAY.366) * UpdateColors16 (DISPLAY.366)
* UpdateColors16 (GDI.366) * UpdateColors16 (GDI.366)
*/ */
INT16 WINAPI UpdateColors16( HDC16 hDC ) INT16 WINAPI UpdateColors16( HDC16 hDC )
{ {
HMODULE mod;
DC *dc; DC *dc;
HWND hWnd;
int size; int size;
if (!(dc = DC_GetDCPtr( hDC ))) return 0; if (!(dc = DC_GetDCPtr( hDC ))) return 0;
size = dc->devCaps->sizePalette; size = dc->devCaps->sizePalette;
GDI_ReleaseObj( hDC ); GDI_ReleaseObj( hDC );
if (Callout.WindowFromDC)
{
hWnd = Callout.WindowFromDC( hDC );
/* Docs say that we have to remap current drawable pixel by pixel mod = GetModuleHandleA("user32.dll");
* but it would take forever given the speed of XGet/PutPixel. if (mod)
*/ {
if (hWnd && size) WindowFromDC_funcptr pWindowFromDC = (WindowFromDC_funcptr)GetProcAddress(mod,"WindowFromDC");
Callout.RedrawWindow( hWnd, NULL, 0, RDW_INVALIDATE ); if (pWindowFromDC)
{
HWND hWnd = pWindowFromDC( hDC );
/* Docs say that we have to remap current drawable pixel by pixel
* but it would take forever given the speed of XGet/PutPixel.
*/
if (hWnd && size)
{
RedrawWindow_funcptr pRedrawWindow = GetProcAddress( mod, "RedrawWindow" );
if (pRedrawWindow) pRedrawWindow( hWnd, NULL, 0, RDW_INVALIDATE );
}
}
} }
return 0x666; return 0x666;
} }

View File

@ -26,8 +26,9 @@
#include "windef.h" #include "windef.h"
#include "winerror.h" #include "winerror.h"
#include "ntddk.h" #include "ntddk.h"
#include "wingdi.h"
#include "winuser.h"
#include "wine/exception.h" #include "wine/exception.h"
#include "callback.h"
#include "thread.h" #include "thread.h"
#include "stackframe.h" #include "stackframe.h"
#include "server.h" #include "server.h"
@ -37,6 +38,8 @@ DEFAULT_DEBUG_CHANNEL(seh);
static PTOP_LEVEL_EXCEPTION_FILTER top_filter; static PTOP_LEVEL_EXCEPTION_FILTER top_filter;
typedef INT (WINAPI *MessageBoxA_funcptr)(HWND,LPCSTR,LPCSTR,UINT);
typedef INT (WINAPI *MessageBoxW_funcptr)(HWND,LPCWSTR,LPCWSTR,UINT);
/******************************************************************* /*******************************************************************
* RaiseException (KERNEL32.@) * RaiseException (KERNEL32.@)
@ -241,14 +244,22 @@ DWORD WINAPI UnhandledExceptionFilter(PEXCEPTION_POINTERS epointers)
strcpy(format, "debugger/winedbg %ld %ld"); strcpy(format, "debugger/winedbg %ld %ld");
} }
if (!bAuto && Callout.MessageBoxA) { if (!bAuto)
format_exception_msg( epointers, buffer ); {
if (Callout.MessageBoxA( 0, buffer, "Error", MB_YESNO | MB_ICONHAND ) == IDNO) { HMODULE mod = GetModuleHandleA( "user32.dll" );
TRACE("Killing process\n"); MessageBoxA_funcptr pMessageBoxA = NULL;
return EXCEPTION_EXECUTE_HANDLER; if (mod) pMessageBoxA = (MessageBoxA_funcptr)GetProcAddress( mod, "MessageBoxA" );
} if (pMessageBoxA)
{
format_exception_msg( epointers, buffer );
if (pMessageBoxA( 0, buffer, "Error", MB_YESNO | MB_ICONHAND ) == IDNO)
{
TRACE("Killing process\n");
return EXCEPTION_EXECUTE_HANDLER;
}
}
} }
if (format[0]) { if (format[0]) {
HANDLE hEvent; HANDLE hEvent;
PROCESS_INFORMATION info; PROCESS_INFORMATION info;
@ -304,11 +315,14 @@ LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(
*/ */
void WINAPI FatalAppExitA( UINT action, LPCSTR str ) void WINAPI FatalAppExitA( UINT action, LPCSTR str )
{ {
HMODULE mod = GetModuleHandleA( "user32.dll" );
MessageBoxA_funcptr pMessageBoxA = NULL;
WARN("AppExit\n"); WARN("AppExit\n");
if (Callout.MessageBoxA)
Callout.MessageBoxA( 0, str, NULL, MB_SYSTEMMODAL | MB_OK ); if (mod) pMessageBoxA = (MessageBoxA_funcptr)GetProcAddress( mod, "MessageBoxA" );
else if (pMessageBoxA) pMessageBoxA( 0, str, NULL, MB_SYSTEMMODAL | MB_OK );
ERR( "%s\n", debugstr_a(str) ); else ERR( "%s\n", debugstr_a(str) );
ExitProcess(0); ExitProcess(0);
} }
@ -318,10 +332,13 @@ void WINAPI FatalAppExitA( UINT action, LPCSTR str )
*/ */
void WINAPI FatalAppExitW( UINT action, LPCWSTR str ) void WINAPI FatalAppExitW( UINT action, LPCWSTR str )
{ {
HMODULE mod = GetModuleHandleA( "user32.dll" );
MessageBoxW_funcptr pMessageBoxW = NULL;
WARN("AppExit\n"); WARN("AppExit\n");
if (Callout.MessageBoxW)
Callout.MessageBoxW( 0, str, NULL, MB_SYSTEMMODAL | MB_OK ); if (mod) pMessageBoxW = (MessageBoxW_funcptr)GetProcAddress( mod, "MessageBoxW" );
else if (pMessageBoxW) pMessageBoxW( 0, str, NULL, MB_SYSTEMMODAL | MB_OK );
ERR( "%s\n", debugstr_w(str) ); else ERR( "%s\n", debugstr_w(str) );
ExitProcess(0); ExitProcess(0);
} }