En el ejemplo test2003.prg de la carpeta samples de FWH, se usa MDI y al tener un control TOutLook a la izquierda, se producía un GPF que en ese ejemplo se solucionaba (provisionalmente) de esta forma:
- Code: Select all Expand view
- function WinRun()
while NoGPF()
if lExit
PostQuitMessage( 0 )
endif
end
return nil
//----------------------------------------------------------------------------//
#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>
BOOL SysRefresh( void );
HB_FUNC( NOGPF )
{
__try
{
hb_retl( SysRefresh() );
}
__except ( ( hb_retl( TRUE ), TRUE ) )
{}
}
Por eso te preguntaba si tu tambien estabas usando la función NoGPF(). De todas formas, y para satisfacción de todos, hoy he "visto" de donde provenía el bug. En FWH source/winapi/mdi.c tenemos:
- Code: Select all Expand view
- LRESULT WINAPI _WndFrameProc( HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam )
{
return DefFrameProc( hWnd, GetWindow( hWnd, GW_CHILD ), wMsg, wParam,
lParam );
}
y ahí estaba el bug puesto que ese código presupone que el primer control hijo de la ventana principal es la ventana MDIClient. En realidad el código (que parece) correcto es:
- Code: Select all Expand view
- LRESULT WINAPI _WndFrameProc( HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam )
{
HWND hWndClient = GetWindow( hWnd, GW_HWNDFIRST );
char szName[ 20 ];
GetClassName( hWndClient, szName, 19 );
while( hWndClient && strcmp( szName, "MDICLIENT" ) != 0 )
{
hWndClient = GetWindow( hWndClient, GW_HWNDNEXT );
GetClassName( hWndClient, szName, 19 );
}
return DefFrameProc( hWnd, hWndClient, wMsg, wParam, lParam );
}
Tomando el primer control hijo de la ventana principal, buscamos hasta encontrar la ventana MDIClient y no presuponemos que es la primera. Gracias a este cambio ahora ya se puede eliminar la llamada a la función WinRun() y a NoGPF() desde test2003.prg y aplicaciones similares