Venho conversando por e-mail com Enrico a alguns dias e, ele me mandou uma solução que funciona.
Código: Selecionar todos
FUNCTION MAIN()
LOCAL cPath := GETENV( "CommonProgramFiles(x86)" )
? cPath
? LFN2SFN( cPath )
INKEY( 0 )
RETURN NIL
FUNCTION LFN2SFN( cDir )
LOCAL cBuffer := SPACE( 261 )
LOCAL nLen := GETSHORTPATHNAME( cDir, @cBuffer, LEN( cBuffer ) )
RETURN IF( nLen != NIL, LEFT( cBuffer, nLen ), cBuffer )
#define DC_CALL_CDECL 0x0010
FUNCTION GETSHORTPATHNAME( cPar1, cPar2, nPar3 )
LOCAL nHandle := DLLLOAD( "Kernel32.dll" )
LOCAL nRet := 0
IF !EMPTY( nHandle )
nRet = DLLCALL( nHandle, DC_CALL_CDECL, "GetShortPathNameA", cPar1, cPar2, nPar3 )
ENDIF
DLLUNLOAD( nHandle )
RETURN nRet
#command IF <condition> THEN <*statements*> => if <condition> ; <statements> ; end
FUNCTION DLLCALL( nHandle, nDummy, cFuncName, xPar1, xPar2, xPar3, xPar4, xPar5, xPar6, xPar7, xPar8, xPar9, xPar10, xPar11, xPar12 )
LOCAL cTyp1 := "C"
LOCAL cTyp2 := "C"
LOCAL cTyp3 := "C"
LOCAL cTyp4 := "C"
LOCAL cTyp5 := "C"
LOCAL cTyp6 := "C"
LOCAL cTyp7 := "C"
LOCAL cTyp8 := "C"
LOCAL cTyp9 := "C"
LOCAL cTyp10 := "C"
LOCAL cTyp11 := "C"
LOCAL cTyp12 := "C"
( nDummy )
IF VALTYPE( xPar1 ) = "N" THEN cTyp1 = "N"
IF VALTYPE( xPar2 ) = "N" THEN cTyp2 = "N"
IF VALTYPE( xPar3 ) = "N" THEN cTyp3 = "N"
IF VALTYPE( xPar4 ) = "N" THEN cTyp4 = "N"
IF VALTYPE( xPar5 ) = "N" THEN cTyp5 = "N"
IF VALTYPE( xPar6 ) = "N" THEN cTyp6 = "N"
IF VALTYPE( xPar7 ) = "N" THEN cTyp7 = "N"
IF VALTYPE( xPar8 ) = "N" THEN cTyp8 = "N"
IF VALTYPE( xPar9 ) = "N" THEN cTyp9 = "N"
IF VALTYPE( xPar10 ) = "N" THEN cTyp10 = "N"
IF VALTYPE( xPar11 ) = "N" THEN cTyp11 = "N"
IF VALTYPE( xPar12 ) = "N" THEN cTyp12 = "N"
RETURN CALLDLL( nHandle, cFuncName, xPar1, cTyp1, xPar2, cTyp2, xPar3, cTyp3, xPar4, cTyp4, xPar5, cTyp5, xPar6, cTyp6, xPar7, cTyp7, xPar8, cTyp8, xPar9, cTyp9, xPar10, cTyp10, xPar11, cTyp11, xPar12, cTyp12 )
#pragma BEGINDUMP
#include "windows.h"
#include "hbapi.h"
HB_FUNC( CALLDLL )
{
FARPROC pFunc = GetProcAddress( hb_parptr( 1 ), hb_parc( 2 ) );
void *pPrm1;
void *pPrm2;
void *pPrm3;
void *pPrm4;
void *pPrm5;
void *pPrm6;
void *pPrm7;
void *pPrm8;
void *pPrm9;
void *pPrm10;
void *pPrm11;
void *pPrm12;
pPrm1 = *hb_parc( 4 ) == 'C' ? hb_parc( 3 ) : ( void * ) hb_parnll( 3 );
pPrm2 = *hb_parc( 6 ) == 'C' ? hb_parc( 5 ) : ( void * ) hb_parnll( 5 );
pPrm3 = *hb_parc( 8 ) == 'C' ? hb_parc( 7 ) : ( void * ) hb_parnll( 7 );
pPrm4 = *hb_parc( 10 ) == 'C' ? hb_parc( 9 ) : ( void * ) hb_parnll( 9 );
pPrm5 = *hb_parc( 12 ) == 'C' ? hb_parc( 11 ) : ( void * ) hb_parnll( 11 );
pPrm6 = *hb_parc( 14 ) == 'C' ? hb_parc( 13 ) : ( void * ) hb_parnll( 13 );
pPrm7 = *hb_parc( 16 ) == 'C' ? hb_parc( 15 ) : ( void * ) hb_parnll( 15 );
pPrm8 = *hb_parc( 18 ) == 'C' ? hb_parc( 17 ) : ( void * ) hb_parnll( 17 );
pPrm9 = *hb_parc( 20 ) == 'C' ? hb_parc( 19 ) : ( void * ) hb_parnll( 19 );
pPrm10 = *hb_parc( 22 ) == 'C' ? hb_parc( 21 ) : ( void * ) hb_parnll( 21 );
pPrm11 = *hb_parc( 24 ) == 'C' ? hb_parc( 23 ) : ( void * ) hb_parnll( 23 );
pPrm12 = *hb_parc( 26 ) == 'C' ? hb_parc( 25 ) : ( void * ) hb_parnll( 25 );
hb_retnl( ( LONG ) ( *pFunc ) ( pPrm1, pPrm2, pPrm3, pPrm4, pPrm5, pPrm6, pPrm7, pPrm8, pPrm9, pPrm10, pPrm11, pPrm12 ) );
}
#pragma ENDDUMP