From 76b91a20b3b3effa18e9fbe5fce7b3d3f1dfcd2b Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Tue, 10 Jun 2008 16:52:29 +0000 Subject: [PATCH] 2008-06-10 18:50 UTC+0100 Viktor Szakats (harbour.01 syenar hu) * contrib/hbw32/dllcall.c ! Fixed to not execute code after hb_errRT*() calls. ! Fixed to call hb_gcFree() if the hb_gcAlloc()ed pointer is not hb_retptrGC()d (in case of errors). --- harbour/ChangeLog | 6 +++++ harbour/contrib/hbw32/dllcall.c | 40 +++++++++++++++++++-------------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 83edd54202..dd3c12e2d6 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,12 @@ 2008-12-31 13:59 UTC+0100 Foo Bar */ +2008-06-10 18:50 UTC+0100 Viktor Szakats (harbour.01 syenar hu) + * contrib/hbw32/dllcall.c + ! Fixed to not execute code after hb_errRT*() calls. + ! Fixed to call hb_gcFree() if the hb_gcAlloc()ed + pointer is not hb_retptrGC()d (in case of errors). + 2008-06-10 19:10 UTC+0300 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt) * harbour/source/vm/hashfunc.c * extended functionality of HB_HSet(), HB_HDel() and HB_HDelAt() diff --git a/harbour/contrib/hbw32/dllcall.c b/harbour/contrib/hbw32/dllcall.c index 4d90a0ff4f..b41887da57 100644 --- a/harbour/contrib/hbw32/dllcall.c +++ b/harbour/contrib/hbw32/dllcall.c @@ -749,26 +749,32 @@ HB_FUNC( DLLPREPARECALL ) } else if( ISNUM( 3 ) ) xec->wOrdinal = hb_parni( 3 ); + + xec->dwType = EXEC_DLL; + xec->lpFunc = ( LPVOID ) GetProcAddress( xec->hDLL, xec->cProc ? ( LPCSTR ) xec->cProc : ( LPCSTR ) xec->wOrdinal ); + + if( xec->lpFunc == NULL && xec->cProc ) + { + /* try ANSI flavour ? */ + xec->cProc[ hb_parclen( 3 ) ] = 'A'; + xec->cProc[ hb_parclen( 3 ) + 1 ] = '\0'; + + xec->lpFunc = ( LPVOID ) GetProcAddress( xec->hDLL, xec->cProc ? ( LPCSTR ) xec->cProc : ( LPCSTR ) xec->wOrdinal ); + } + + if( xec->lpFunc ) + hb_retptrGC( xec ); + else + { + hb_gcFree( xec ); + hb_errRT_BASE( EG_ARG, 2010, ISCHAR( 3 ) ? "GetProcAddress() invalid name argument" : "GetProcAddress() invalid ordinal argument", HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); + } } else - hb_errRT_BASE( EG_ARG, 2010, xec->cDLL ? "LoadLibrary() failed" : "Invalid handle argument", HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); - - xec->dwType = EXEC_DLL; - xec->lpFunc = ( LPVOID ) GetProcAddress( xec->hDLL, xec->cProc ? ( LPCSTR ) xec->cProc : ( LPCSTR ) xec->wOrdinal ); - - if( xec->lpFunc == NULL && xec->cProc ) { - /* try ANSI flavour ? */ - xec->cProc[ hb_parclen( 3 ) ] = 'A'; - xec->cProc[ hb_parclen( 3 ) + 1 ] = '\0'; - - xec->lpFunc = ( LPVOID ) GetProcAddress( xec->hDLL, xec->cProc ? ( LPCSTR ) xec->cProc : ( LPCSTR ) xec->wOrdinal ); + hb_gcFree( xec ); + hb_errRT_BASE( EG_ARG, 2010, ISCHAR( 1 ) ? "LoadLibrary() failed" : "Invalid handle argument", HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); } - - if( xec->hDLL && xec->lpFunc ) - hb_retptrGC( xec ); - else if( xec->hDLL && xec->lpFunc == NULL ) - hb_errRT_BASE( EG_ARG, 2010, xec->cProc ? "GetProcAddress() invalid name argument" : "GetProcAddress() invalid ordinal argument", HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); } HB_FUNC( DLLLOAD ) @@ -890,4 +896,4 @@ HB_FUNC( CALLDLLTYPED ) DllExec( DC_CALL_STD, hb_parni( 2 ), ( LPVOID ) hb_parptr( 1 ), NULL, hb_pcount(), 3 ); } -#endif /* HB_OS_WIN32 */ +#endif