diff --git a/harbour/ChangeLog b/harbour/ChangeLog index e8b586289c..bd21120253 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,17 @@ past entries belonging to author(s): Viktor Szakats. */ +2009-12-20 12:29 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + * contrib/hbwin/win_dll.c + + Added support for Win64 dll calls to functions with no + parameter. + + Added internal support to call UNICODE functions in Win64 mode. + + Added support for CP conversion for non-UNICODE functions in Win64 mode. + (for now this is the only active mode). + ! DllCall() made static function. + * Renamed some constants, functions and variables. + ; TODO: Add logic to enable UNICODE mode when needed. + 2009-12-20 05:01 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * src/vm/dynlibhb.c * src/rtl/hbinet.c diff --git a/harbour/contrib/hbwin/win_dll.c b/harbour/contrib/hbwin/win_dll.c index a76122584a..db1c83046d 100644 --- a/harbour/contrib/hbwin/win_dll.c +++ b/harbour/contrib/hbwin/win_dll.c @@ -87,27 +87,24 @@ * 20/07/2002. */ -/* Calling conventions */ -#define DLL_CDECL DC_CALL_CDECL -#define DLL_STDCALL DC_CALL_STD - -/* Parameter passing mode */ +/* Call flags */ #define DLL_CALLMODE_NORMAL 0x0000 #define DLL_CALLMODE_COPY 0x2000 - #define DC_MICROSOFT 0x0000 /* Default */ #define DC_BORLAND 0x0001 /* Borland compatible */ #define DC_CALL_CDECL 0x0010 /* __cdecl */ -#define DC_CALL_STD 0x0020 /* __stdcall */ +#define DC_CALL_STDCALL 0x0020 /* __stdcall */ #define DC_RETVAL_MATH4 0x0100 /* Return value in ST */ #define DC_RETVAL_MATH8 0x0200 /* Return value in ST */ +#define DC_UNICODE 0x0400 +#define DC_CALL_STDCALL_BO ( DC_CALL_STDCALL | DC_BORLAND ) +#define DC_CALL_STDCALL_MS ( DC_CALL_STDCALL | DC_MICROSOFT ) +#define DC_CALL_STDCALL_M8 ( DC_CALL_STDCALL | DC_RETVAL_MATH8 ) -#define DC_CALL_STD_BO ( DC_CALL_STD | DC_BORLAND ) -#define DC_CALL_STD_MS ( DC_CALL_STD | DC_MICROSOFT ) -#define DC_CALL_STD_M8 ( DC_CALL_STD | DC_RETVAL_MATH8 ) - -#define DC_FLAG_ARGPTR 0x00000002 +/* Parameter flags */ +#define DC_PARFLAG_ARGPTR 0x0002 +/* C Types */ #define CTYPE_VOID 9 #define CTYPE_CHAR 1 #define CTYPE_UNSIGNED_CHAR -1 @@ -148,8 +145,8 @@ typedef union typedef struct { - DWORD dwFlags; /* Parameter flags */ - int nWidth; /* Byte width */ + int iParFlags; /* Parameter flags */ + int iWidth; /* Byte width */ union { BYTE bArg; /* 1-byte argument */ @@ -162,12 +159,14 @@ typedef struct #pragma pack() -HB_DYNRETVAL DynaCall( int iFlags, FARPROC lpFunction, int nArgs, HB_DYNPARAM Parm[], void * pRet, int nRetSiz ) +#if ! defined( HB_OS_WIN_64 ) + +static HB_DYNRETVAL hb_DynaCall( int iFlags, FARPROC lpFunction, int nArgs, HB_DYNPARAM Parm[], void * pRet, int nRetSiz ) { /* Call the specified function with the given parameters. Build a proper stack and take care of correct return value processing. */ HB_DYNRETVAL Res = { 0 }; -#if defined( HB_OS_WIN_CE ) || defined( HB_OS_WIN_64 ) +#if defined( HB_OS_WIN_CE ) HB_SYMBOL_UNUSED( iFlags ); HB_SYMBOL_UNUSED( lpFunction ); HB_SYMBOL_UNUSED( nArgs ); @@ -205,7 +204,7 @@ HB_DYNRETVAL DynaCall( int iFlags, FARPROC lpFunction, int nArgs, HB_DYNPARAM Pa { nInd = ( nArgs - 1 ) - i; /* Start at the back of the arg ptr, aligned on a DWORD */ - nSize = ( Parm[ nInd ].nWidth + 3 ) / 4 * 4; + nSize = ( Parm[ nInd ].iWidth + 3 ) / 4 * 4; pArg = ( BYTE * ) Parm[ nInd ].pArg + nSize - 4; dwStSize += ( DWORD ) nSize; /* Count no of bytes on stack */ @@ -214,7 +213,7 @@ HB_DYNRETVAL DynaCall( int iFlags, FARPROC lpFunction, int nArgs, HB_DYNPARAM Pa while( nSize > 0 ) { /* Copy argument to the stack */ - if( Parm[ nInd ].dwFlags & DC_FLAG_ARGPTR ) + if( Parm[ nInd ].iParFlags & DC_PARFLAG_ARGPTR ) { /* Arg has a ptr to a variable that has the arg */ dwVal = ( DWORD ) pArg; /* Get first four bytes */ @@ -369,6 +368,8 @@ HB_DYNRETVAL DynaCall( int iFlags, FARPROC lpFunction, int nArgs, HB_DYNPARAM Pa return Res; } +#endif + /* * ================================================================== */ @@ -377,17 +378,26 @@ typedef struct { HMODULE hDLL; /* Handle */ HB_BOOL bFreeDLL; /* Free library handle on destroy? */ - DWORD dwFlags; /* Calling Flags */ - FARPROC lpFunc; /* Function Address */ + int iCallFlags; /* Calling Flags */ + FARPROC lpFunction; /* Function Address */ } HB_DLLEXEC, * PHB_DLLEXEC; #define _DLLEXEC_MAXPARAM 15 #if defined( HB_OS_WIN_64 ) -static HB_U64 hb_u64par( int iParam ) +typedef struct { - PHB_ITEM pParam = hb_param( iParam, HB_IT_ANY ); + HB_BOOL bUNICODE; + int iRetType; + int iFirst; + int iString; + void ** hString; +} HB_WINCALL, * PHB_WINCALL; + +static HB_U64 hb_u64par( PHB_WINCALL wcall, int iParam ) +{ + PHB_ITEM pParam = hb_param( wcall->iFirst + iParam, HB_IT_ANY ); HB_U64 r = 0; if( pParam ) @@ -411,7 +421,10 @@ static HB_U64 hb_u64par( int iParam ) case HB_IT_STRING: case HB_IT_MEMO: - r = ( HB_PTRUINT ) hb_itemGetCPtr( pParam ); + if( wcall->bUNICODE ) + r = ( HB_PTRUINT ) hb_itemGetStrU16( pParam, HB_CDP_ENDIAN_NATIVE, &wcall->hString[ wcall->iString++ ], NULL ); + else + r = ( HB_PTRUINT ) hb_itemGetStr( pParam, hb_setGetOSCP(), &wcall->hString[ wcall->iString++ ], NULL ); break; } } @@ -419,9 +432,9 @@ static HB_U64 hb_u64par( int iParam ) return r; } -static void hb_u64ret( int iType, HB_U64 nValue ) +static void hb_u64ret( PHB_WINCALL wcall, HB_U64 nValue ) { - switch( iType ) + switch( wcall->iRetType ) { case CTYPE_VOID: hb_ret(); @@ -450,7 +463,10 @@ static void hb_u64ret( int iType, HB_U64 nValue ) case CTYPE_CHAR_PTR: case CTYPE_UNSIGNED_CHAR_PTR: - hb_retc( ( char * ) nValue ); + if( wcall->bUNICODE ) + hb_retstr_u16( HB_CDP_ENDIAN_NATIVE, ( const HB_WCHAR * ) nValue ); + else + hb_retstr( hb_setGetOSCP(), ( const char * ) nValue ); break; case CTYPE_INT_PTR: @@ -473,6 +489,7 @@ static void hb_u64ret( int iType, HB_U64 nValue ) } } +typedef HB_U64( WINAPI * WIN64_00 ) ( void ); typedef HB_U64( WINAPI * WIN64_01 ) ( HB_U64 ); typedef HB_U64( WINAPI * WIN64_02 ) ( HB_U64, HB_U64 ); typedef HB_U64( WINAPI * WIN64_03 ) ( HB_U64, HB_U64, HB_U64 ); @@ -489,6 +506,7 @@ typedef HB_U64( WINAPI * WIN64_13 ) ( HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB typedef HB_U64( WINAPI * WIN64_14 ) ( HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64 ); typedef HB_U64( WINAPI * WIN64_15 ) ( HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64 ); +static HB_U64 win64_00( FARPROC p ) { return ( ( WIN64_00 ) *p )(); } static HB_U64 win64_01( FARPROC p, HB_U64 p01 ) { return ( ( WIN64_01 ) *p )( p01 ); } static HB_U64 win64_02( FARPROC p, HB_U64 p01, HB_U64 p02 ) { return ( ( WIN64_02 ) *p )( p01, p02 ); } static HB_U64 win64_03( FARPROC p, HB_U64 p01, HB_U64 p02, HB_U64 p03 ) { return ( ( WIN64_03 ) *p )( p01, p02, p03 ); } @@ -508,36 +526,52 @@ static HB_U64 win64_15( FARPROC p, HB_U64 p01, HB_U64 p02, HB_U64 p03, HB_U64 p0 #endif /* Based originally on CallDLL() from What32 */ -static void DllExec( int iFlags, int iRtype, FARPROC lpFunction, PHB_DLLEXEC xec, int iParams, int iFirst ) +static void hb_DllExec( int iCallFlags, int iRtype, FARPROC lpFunction, PHB_DLLEXEC xec, int iParams, int iFirst ) { #if defined( HB_OS_WIN_64 ) + HB_WINCALL wcall; - HB_SYMBOL_UNUSED( iFlags ); - HB_SYMBOL_UNUSED( xec ); + HB_SYMBOL_UNUSED( iCallFlags ); --iFirst; + iParams -= iFirst; - switch( iParams - iFirst ) + wcall.bUNICODE = ( xec != NULL ) && ( xec->iCallFlags & DC_UNICODE ); + wcall.iRetType = iRtype; + wcall.iFirst = iFirst; + wcall.iString = 0; + wcall.hString = iParams ? ( void ** ) hb_xgrab( iParams * sizeof( void * ) ) : NULL; + + switch( iParams ) { - case 1: hb_u64ret( iRtype, win64_01( lpFunction, hb_u64par( iFirst + 1 ) ) ); break; - case 2: hb_u64ret( iRtype, win64_02( lpFunction, hb_u64par( iFirst + 1 ), hb_u64par( iFirst + 2 ) ) ); break; - case 3: hb_u64ret( iRtype, win64_03( lpFunction, hb_u64par( iFirst + 1 ), hb_u64par( iFirst + 2 ), hb_u64par( iFirst + 3 ) ) ); break; - case 4: hb_u64ret( iRtype, win64_04( lpFunction, hb_u64par( iFirst + 1 ), hb_u64par( iFirst + 2 ), hb_u64par( iFirst + 3 ), hb_u64par( iFirst + 4 ) ) ); break; - case 5: hb_u64ret( iRtype, win64_05( lpFunction, hb_u64par( iFirst + 1 ), hb_u64par( iFirst + 2 ), hb_u64par( iFirst + 3 ), hb_u64par( iFirst + 4 ), hb_u64par( iFirst + 5 ) ) ); break; - case 6: hb_u64ret( iRtype, win64_06( lpFunction, hb_u64par( iFirst + 1 ), hb_u64par( iFirst + 2 ), hb_u64par( iFirst + 3 ), hb_u64par( iFirst + 4 ), hb_u64par( iFirst + 5 ), hb_u64par( iFirst + 6 ) ) ); break; - case 7: hb_u64ret( iRtype, win64_07( lpFunction, hb_u64par( iFirst + 1 ), hb_u64par( iFirst + 2 ), hb_u64par( iFirst + 3 ), hb_u64par( iFirst + 4 ), hb_u64par( iFirst + 5 ), hb_u64par( iFirst + 6 ), hb_u64par( iFirst + 7 ) ) ); break; - case 8: hb_u64ret( iRtype, win64_08( lpFunction, hb_u64par( iFirst + 1 ), hb_u64par( iFirst + 2 ), hb_u64par( iFirst + 3 ), hb_u64par( iFirst + 4 ), hb_u64par( iFirst + 5 ), hb_u64par( iFirst + 6 ), hb_u64par( iFirst + 7 ), hb_u64par( iFirst + 8 ) ) ); break; - case 9: hb_u64ret( iRtype, win64_09( lpFunction, hb_u64par( iFirst + 1 ), hb_u64par( iFirst + 2 ), hb_u64par( iFirst + 3 ), hb_u64par( iFirst + 4 ), hb_u64par( iFirst + 5 ), hb_u64par( iFirst + 6 ), hb_u64par( iFirst + 7 ), hb_u64par( iFirst + 8 ), hb_u64par( iFirst + 9 ) ) ); break; - case 10: hb_u64ret( iRtype, win64_10( lpFunction, hb_u64par( iFirst + 1 ), hb_u64par( iFirst + 2 ), hb_u64par( iFirst + 3 ), hb_u64par( iFirst + 4 ), hb_u64par( iFirst + 5 ), hb_u64par( iFirst + 6 ), hb_u64par( iFirst + 7 ), hb_u64par( iFirst + 8 ), hb_u64par( iFirst + 9 ), hb_u64par( iFirst + 10 ) ) ); break; - case 11: hb_u64ret( iRtype, win64_11( lpFunction, hb_u64par( iFirst + 1 ), hb_u64par( iFirst + 2 ), hb_u64par( iFirst + 3 ), hb_u64par( iFirst + 4 ), hb_u64par( iFirst + 5 ), hb_u64par( iFirst + 6 ), hb_u64par( iFirst + 7 ), hb_u64par( iFirst + 8 ), hb_u64par( iFirst + 9 ), hb_u64par( iFirst + 10 ), hb_u64par( iFirst + 11 ) ) ); break; - case 12: hb_u64ret( iRtype, win64_12( lpFunction, hb_u64par( iFirst + 1 ), hb_u64par( iFirst + 2 ), hb_u64par( iFirst + 3 ), hb_u64par( iFirst + 4 ), hb_u64par( iFirst + 5 ), hb_u64par( iFirst + 6 ), hb_u64par( iFirst + 7 ), hb_u64par( iFirst + 8 ), hb_u64par( iFirst + 9 ), hb_u64par( iFirst + 10 ), hb_u64par( iFirst + 11 ), hb_u64par( iFirst + 12 ) ) ); break; - case 13: hb_u64ret( iRtype, win64_13( lpFunction, hb_u64par( iFirst + 1 ), hb_u64par( iFirst + 2 ), hb_u64par( iFirst + 3 ), hb_u64par( iFirst + 4 ), hb_u64par( iFirst + 5 ), hb_u64par( iFirst + 6 ), hb_u64par( iFirst + 7 ), hb_u64par( iFirst + 8 ), hb_u64par( iFirst + 9 ), hb_u64par( iFirst + 10 ), hb_u64par( iFirst + 11 ), hb_u64par( iFirst + 12 ), hb_u64par( iFirst + 13 ) ) ); break; - case 14: hb_u64ret( iRtype, win64_14( lpFunction, hb_u64par( iFirst + 1 ), hb_u64par( iFirst + 2 ), hb_u64par( iFirst + 3 ), hb_u64par( iFirst + 4 ), hb_u64par( iFirst + 5 ), hb_u64par( iFirst + 6 ), hb_u64par( iFirst + 7 ), hb_u64par( iFirst + 8 ), hb_u64par( iFirst + 9 ), hb_u64par( iFirst + 10 ), hb_u64par( iFirst + 11 ), hb_u64par( iFirst + 12 ), hb_u64par( iFirst + 13 ), hb_u64par( iFirst + 14 ) ) ); break; - case 15: hb_u64ret( iRtype, win64_15( lpFunction, hb_u64par( iFirst + 1 ), hb_u64par( iFirst + 2 ), hb_u64par( iFirst + 3 ), hb_u64par( iFirst + 4 ), hb_u64par( iFirst + 5 ), hb_u64par( iFirst + 6 ), hb_u64par( iFirst + 7 ), hb_u64par( iFirst + 8 ), hb_u64par( iFirst + 9 ), hb_u64par( iFirst + 10 ), hb_u64par( iFirst + 11 ), hb_u64par( iFirst + 12 ), hb_u64par( iFirst + 13 ), hb_u64par( iFirst + 14 ), hb_u64par( iFirst + 15 ) ) ); break; + case 0: hb_u64ret( &wcall, win64_00( lpFunction ) ); break; + case 1: hb_u64ret( &wcall, win64_01( lpFunction, hb_u64par( &wcall, 1 ) ) ); break; + case 2: hb_u64ret( &wcall, win64_02( lpFunction, hb_u64par( &wcall, 1 ), hb_u64par( &wcall, 2 ) ) ); break; + case 3: hb_u64ret( &wcall, win64_03( lpFunction, hb_u64par( &wcall, 1 ), hb_u64par( &wcall, 2 ), hb_u64par( &wcall, 3 ) ) ); break; + case 4: hb_u64ret( &wcall, win64_04( lpFunction, hb_u64par( &wcall, 1 ), hb_u64par( &wcall, 2 ), hb_u64par( &wcall, 3 ), hb_u64par( &wcall, 4 ) ) ); break; + case 5: hb_u64ret( &wcall, win64_05( lpFunction, hb_u64par( &wcall, 1 ), hb_u64par( &wcall, 2 ), hb_u64par( &wcall, 3 ), hb_u64par( &wcall, 4 ), hb_u64par( &wcall, 5 ) ) ); break; + case 6: hb_u64ret( &wcall, win64_06( lpFunction, hb_u64par( &wcall, 1 ), hb_u64par( &wcall, 2 ), hb_u64par( &wcall, 3 ), hb_u64par( &wcall, 4 ), hb_u64par( &wcall, 5 ), hb_u64par( &wcall, 6 ) ) ); break; + case 7: hb_u64ret( &wcall, win64_07( lpFunction, hb_u64par( &wcall, 1 ), hb_u64par( &wcall, 2 ), hb_u64par( &wcall, 3 ), hb_u64par( &wcall, 4 ), hb_u64par( &wcall, 5 ), hb_u64par( &wcall, 6 ), hb_u64par( &wcall, 7 ) ) ); break; + case 8: hb_u64ret( &wcall, win64_08( lpFunction, hb_u64par( &wcall, 1 ), hb_u64par( &wcall, 2 ), hb_u64par( &wcall, 3 ), hb_u64par( &wcall, 4 ), hb_u64par( &wcall, 5 ), hb_u64par( &wcall, 6 ), hb_u64par( &wcall, 7 ), hb_u64par( &wcall, 8 ) ) ); break; + case 9: hb_u64ret( &wcall, win64_09( lpFunction, hb_u64par( &wcall, 1 ), hb_u64par( &wcall, 2 ), hb_u64par( &wcall, 3 ), hb_u64par( &wcall, 4 ), hb_u64par( &wcall, 5 ), hb_u64par( &wcall, 6 ), hb_u64par( &wcall, 7 ), hb_u64par( &wcall, 8 ), hb_u64par( &wcall, 9 ) ) ); break; + case 10: hb_u64ret( &wcall, win64_10( lpFunction, hb_u64par( &wcall, 1 ), hb_u64par( &wcall, 2 ), hb_u64par( &wcall, 3 ), hb_u64par( &wcall, 4 ), hb_u64par( &wcall, 5 ), hb_u64par( &wcall, 6 ), hb_u64par( &wcall, 7 ), hb_u64par( &wcall, 8 ), hb_u64par( &wcall, 9 ), hb_u64par( &wcall, 10 ) ) ); break; + case 11: hb_u64ret( &wcall, win64_11( lpFunction, hb_u64par( &wcall, 1 ), hb_u64par( &wcall, 2 ), hb_u64par( &wcall, 3 ), hb_u64par( &wcall, 4 ), hb_u64par( &wcall, 5 ), hb_u64par( &wcall, 6 ), hb_u64par( &wcall, 7 ), hb_u64par( &wcall, 8 ), hb_u64par( &wcall, 9 ), hb_u64par( &wcall, 10 ), hb_u64par( &wcall, 11 ) ) ); break; + case 12: hb_u64ret( &wcall, win64_12( lpFunction, hb_u64par( &wcall, 1 ), hb_u64par( &wcall, 2 ), hb_u64par( &wcall, 3 ), hb_u64par( &wcall, 4 ), hb_u64par( &wcall, 5 ), hb_u64par( &wcall, 6 ), hb_u64par( &wcall, 7 ), hb_u64par( &wcall, 8 ), hb_u64par( &wcall, 9 ), hb_u64par( &wcall, 10 ), hb_u64par( &wcall, 11 ), hb_u64par( &wcall, 12 ) ) ); break; + case 13: hb_u64ret( &wcall, win64_13( lpFunction, hb_u64par( &wcall, 1 ), hb_u64par( &wcall, 2 ), hb_u64par( &wcall, 3 ), hb_u64par( &wcall, 4 ), hb_u64par( &wcall, 5 ), hb_u64par( &wcall, 6 ), hb_u64par( &wcall, 7 ), hb_u64par( &wcall, 8 ), hb_u64par( &wcall, 9 ), hb_u64par( &wcall, 10 ), hb_u64par( &wcall, 11 ), hb_u64par( &wcall, 12 ), hb_u64par( &wcall, 13 ) ) ); break; + case 14: hb_u64ret( &wcall, win64_14( lpFunction, hb_u64par( &wcall, 1 ), hb_u64par( &wcall, 2 ), hb_u64par( &wcall, 3 ), hb_u64par( &wcall, 4 ), hb_u64par( &wcall, 5 ), hb_u64par( &wcall, 6 ), hb_u64par( &wcall, 7 ), hb_u64par( &wcall, 8 ), hb_u64par( &wcall, 9 ), hb_u64par( &wcall, 10 ), hb_u64par( &wcall, 11 ), hb_u64par( &wcall, 12 ), hb_u64par( &wcall, 13 ), hb_u64par( &wcall, 14 ) ) ); break; + case 15: hb_u64ret( &wcall, win64_15( lpFunction, hb_u64par( &wcall, 1 ), hb_u64par( &wcall, 2 ), hb_u64par( &wcall, 3 ), hb_u64par( &wcall, 4 ), hb_u64par( &wcall, 5 ), hb_u64par( &wcall, 6 ), hb_u64par( &wcall, 7 ), hb_u64par( &wcall, 8 ), hb_u64par( &wcall, 9 ), hb_u64par( &wcall, 10 ), hb_u64par( &wcall, 11 ), hb_u64par( &wcall, 12 ), hb_u64par( &wcall, 13 ), hb_u64par( &wcall, 14 ), hb_u64par( &wcall, 15 ) ) ); break; default: hb_errRT_BASE( EG_ARG, 2010, "A maximum of 15 parameters is supported", HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); } + if( wcall.hString ) + { + while( --wcall.iString >= 0 ) + hb_strfree( wcall.hString[ wcall.iString ] ); + + hb_xfree( wcall.hString ); + } + #else HB_DYNPARAM Parm[ _DLLEXEC_MAXPARAM ]; @@ -549,15 +583,15 @@ static void DllExec( int iFlags, int iRtype, FARPROC lpFunction, PHB_DLLEXEC xec if( xec ) { - iFlags = xec->dwFlags; - lpFunction = xec->lpFunc; + iCallFlags = xec->iCallFlags; + lpFunction = xec->lpFunction; /* TODO: Params maybe explictly specified in xec! */ } iArgCnt = iParams - iFirst + 1; - iFlags &= 0x00ff; /* Calling Convention */ + iCallFlags &= 0x00FF; /* Calling Convention */ if( iRtype == 0 ) iRtype = CTYPE_UNSIGNED_LONG; @@ -573,20 +607,20 @@ static void DllExec( int iFlags, int iRtype, FARPROC lpFunction, PHB_DLLEXEC xec switch( HB_ITEM_TYPE( pParam ) ) { case HB_IT_NIL: - Parm[ iCnt ].nWidth = sizeof( void * ); + Parm[ iCnt ].iWidth = sizeof( void * ); /* TOFIX: Store NULL pointer in pointer variable. */ Parm[ iCnt ].numargs.dwArg = 0; break; case HB_IT_POINTER: - Parm[ iCnt ].nWidth = sizeof( void * ); + Parm[ iCnt ].iWidth = sizeof( void * ); /* TOFIX: Store pointer in pointer variable. */ Parm[ iCnt ].numargs.dwArg = ( DWORD ) hb_itemGetPtr( pParam ); if( hb_parinfo( i ) & HB_IT_BYREF ) { Parm[ iCnt ].pArg = &( Parm[ iCnt ].numargs.dwArg ); - Parm[ iCnt ].dwFlags = DC_FLAG_ARGPTR; /* use the pointer */ + Parm[ iCnt ].iParFlags = DC_PARFLAG_ARGPTR; /* use the pointer */ } break; @@ -595,33 +629,33 @@ static void DllExec( int iFlags, int iRtype, FARPROC lpFunction, PHB_DLLEXEC xec case HB_IT_DATE: case HB_IT_LOGICAL: /* TOFIX: HB_IT_LONG is 64 bit integer */ - Parm[ iCnt ].nWidth = sizeof( DWORD ); + Parm[ iCnt ].iWidth = sizeof( DWORD ); Parm[ iCnt ].numargs.dwArg = ( DWORD ) hb_itemGetNL( pParam ); if( hb_parinfo( i ) & HB_IT_BYREF ) { Parm[ iCnt ].pArg = &( Parm[ iCnt ].numargs.dwArg ); - Parm[ iCnt ].dwFlags = DC_FLAG_ARGPTR; /* use the pointer */ + Parm[ iCnt ].iParFlags = DC_PARFLAG_ARGPTR; /* use the pointer */ } break; case HB_IT_DOUBLE: - Parm[ iCnt ].nWidth = sizeof( double ); + Parm[ iCnt ].iWidth = sizeof( double ); Parm[ iCnt ].numargs.dArg = hb_itemGetND( pParam ); if( hb_parinfo( i ) & HB_IT_BYREF ) { - Parm[ iCnt ].nWidth = sizeof( void * ); + Parm[ iCnt ].iWidth = sizeof( void * ); Parm[ iCnt ].pArg = &( Parm[ iCnt ].numargs.dArg ); - Parm[ iCnt ].dwFlags = DC_FLAG_ARGPTR; /* use the pointer */ + Parm[ iCnt ].iParFlags = DC_PARFLAG_ARGPTR; /* use the pointer */ } - iFlags |= DC_RETVAL_MATH8; + iCallFlags |= DC_RETVAL_MATH8; break; case HB_IT_STRING: case HB_IT_MEMO: - Parm[ iCnt ].nWidth = sizeof( void * ); + Parm[ iCnt ].iWidth = sizeof( void * ); if( hb_parinfo( i ) & HB_IT_BYREF ) { @@ -630,13 +664,13 @@ static void DllExec( int iFlags, int iRtype, FARPROC lpFunction, PHB_DLLEXEC xec } else { - if( iFlags & DLL_CALLMODE_COPY ) + if( iCallFlags & DLL_CALLMODE_COPY ) pParam = hb_itemUnShareString( pParam ); Parm[ iCnt ].pArg = ( void * ) hb_itemGetCPtr( pParam ); } - Parm[ iCnt ].dwFlags = DC_FLAG_ARGPTR; /* use the pointer */ + Parm[ iCnt ].iParFlags = DC_PARFLAG_ARGPTR; /* use the pointer */ break; case HB_IT_ARRAY: @@ -651,7 +685,7 @@ static void DllExec( int iFlags, int iRtype, FARPROC lpFunction, PHB_DLLEXEC xec } } - rc = DynaCall( iFlags, lpFunction, iArgCnt, Parm, NULL, 0 ); + rc = hb_DynaCall( iCallFlags, lpFunction, iArgCnt, Parm, NULL, 0 ); if( iArgCnt > 0 ) { @@ -778,22 +812,21 @@ static const HB_GC_FUNCS s_gcDllFuncs = hb_gcDummyMark }; - static FARPROC hb_getprocaddress( HMODULE hDLL, int iParam ) { #if defined( HB_OS_WIN_CE ) void * hStr; - ULONG ulLen; - LPCWSTR szProc = hb_parstr_u16( iParam, HB_CDP_ENDIAN_NATIVE, &hStr, &ulLen ); + HB_SIZE nLen; + LPCWSTR szProc = hb_parstr_u16( iParam, HB_CDP_ENDIAN_NATIVE, &hStr, &nLen ); FARPROC lpFunction = GetProcAddress( hDLL, szProc ? szProc : ( LPCWSTR ) ( HB_PTRDIFF ) ( hb_parni( iParam ) & 0x0FFFF ) ); if( ! lpFunction && szProc ) /* try with WIDE suffix? */ { - LPWSTR pszProcW = ( LPWSTR ) hb_xgrab( ( ulLen + 2 ) * sizeof( WCHAR ) ); - memcpy( pszProcW, szProc, ulLen * sizeof( WCHAR ) ); - pszProcW[ ulLen++ ] = L'W'; - pszProcW[ ulLen++ ] = 0; + LPWSTR pszProcW = ( LPWSTR ) hb_xgrab( ( nLen + 2 ) * sizeof( WCHAR ) ); + memcpy( pszProcW, szProc, nLen * sizeof( WCHAR ) ); + pszProcW[ nLen++ ] = L'W'; + pszProcW[ nLen++ ] = 0; lpFunction = GetProcAddress( hDLL, pszProcW ); hb_xfree( pszProcW ); } @@ -873,7 +906,7 @@ HB_FUNC( DLLCALL ) if( hDLL && ( HB_PTRDIFF ) hDLL >= 32 ) { - DllExec( hb_parni( 2 ), 0, hb_getprocaddress( ( HMODULE ) hDLL, 3 ), NULL, hb_pcount(), 4 ); + hb_DllExec( hb_parni( 2 ), 0, hb_getprocaddress( ( HMODULE ) hDLL, 3 ), NULL, hb_pcount(), 4 ); if( HB_ISCHAR( 1 ) ) FreeLibrary( hDLL ); @@ -904,10 +937,10 @@ HB_FUNC( DLLPREPARECALL ) if( xec->hDLL ) { - xec->lpFunc = hb_getprocaddress( xec->hDLL, 3 ); - if( xec->lpFunc ) + xec->lpFunction = hb_getprocaddress( xec->hDLL, 3 ); + if( xec->lpFunction ) { - xec->dwFlags = HB_ISNUM( 2 ) ? hb_parnl( 2 ) : DC_CALL_STD; + xec->iCallFlags = HB_ISNUM( 2 ) ? hb_parnl( 2 ) : DC_CALL_STDCALL; hb_retptrGC( xec ); return; } @@ -925,8 +958,8 @@ HB_FUNC( DLLEXECUTECALL ) { PHB_DLLEXEC xec = ( PHB_DLLEXEC ) hb_parptrGC( &s_gcDllFuncs, 1 ); - if( xec && xec->hDLL && xec->lpFunc ) - DllExec( 0, 0, NULL, xec, hb_pcount(), 2 ); + if( xec && xec->hDLL && xec->lpFunction ) + hb_DllExec( 0, 0, NULL, xec, hb_pcount(), 2 ); } #endif /* HB_COMPAT_XPP */ @@ -937,17 +970,17 @@ HB_FUNC( DLLEXECUTECALL ) GetProcAddress() above. Note that it is hardcoded to use PASCAL calling convention. */ HB_FUNC( CALLDLL ) { - DllExec( DC_CALL_STD, 0, ( FARPROC ) hb_parptr( 1 ), NULL, hb_pcount(), 2 ); + hb_DllExec( DC_CALL_STDCALL, 0, ( FARPROC ) hb_parptr( 1 ), NULL, hb_pcount(), 2 ); } HB_FUNC( CALLDLLBOOL ) { - DllExec( DC_CALL_STD, CTYPE_BOOL, ( FARPROC ) hb_parptr( 1 ), NULL, hb_pcount(), 2 ); + hb_DllExec( DC_CALL_STDCALL, CTYPE_BOOL, ( FARPROC ) hb_parptr( 1 ), NULL, hb_pcount(), 2 ); } HB_FUNC( CALLDLLTYPED ) { - DllExec( DC_CALL_STD, hb_parni( 2 ), ( FARPROC ) hb_parptr( 1 ), NULL, hb_pcount(), 3 ); + hb_DllExec( DC_CALL_STDCALL, hb_parni( 2 ), ( FARPROC ) hb_parptr( 1 ), NULL, hb_pcount(), 3 ); } #endif /* HB_OS_WIN && && !__CYGWIN__ !HB_NO_ASM */