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:
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:
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:
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