Page 1 of 1

FunSwap.. no funciona en todo el sistema -ANTONIO

Posted: Tue Mar 05, 2013 1:15 pm
by Adolfo
Antonio

Hace tiempo publicastes la rutina de FUNSWAP, yo la quiero utilizar para reemplazar la funcion DATE()

FunSwap("DATE","MYDATE")

Pero solo me funciona en el PRG principal, yo tengo puesta la llamada dentro de la funcion Main(), esperando que reemplazara DATE() en TODO EL SISTEMA, pero no ocurre asi.
La funcion de reemplazo tambien esta dentro de ese prg, y no es static.

Function MYDATE()
Return CTOD("01/01/2013")


Me falto algo.
El codigo es el mismo que publicastes

Code: Select all

//------------------------------------------------------------
#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>

HB_FUNC( NEXTMEM ) // --> nHardwareMemory
{
   MEMORYSTATUSEX mst;

   memset( &mst, 0, sizeof( MEMORYSTATUSEX ) );
   mst.dwLength = sizeof( MEMORYSTATUSEX );

   GlobalMemoryStatusEx( &mst );

   hb_retnll( mst.ullAvailPhys );
}

HB_FUNC( CURDRIVE )
{
   char szCurDrive[ 1 ];
   const char * szDrive;

   szCurDrive[ 0 ] = ( ( char ) hb_fsCurDrv() ) + 'A';
   hb_retclen( szCurDrive, 1 );
}

typedef void ( * PFUNC ) ( void );

HB_FUNC( FUNSWAP )
{
   PHB_SYMB symFirst = hb_dynsymSymbol( hb_dynsymFindName( hb_parc( 1 ) ) );
   PHB_SYMB symLast  = hb_dynsymSymbol( hb_dynsymFindName( hb_parc( 2 ) ) );
   PHB_FUNC pFirst   = symFirst->value.pFunPtr;

   symFirst->value.pFunPtr = symLast->value.pFunPtr;

   hb_retnl( ( LONG ) pFirst );
}

HB_FUNC( EXECPTR )
{
   PFUNC p = ( PFUNC ) hb_parnl( hb_pcount() );

   p();
}
#pragma ENDDUMP
Aproveche de agregar 2 funciones mas que utilizo, NEXTMEM y CURDRIVE
Cualquier Ayuda sera bienvenida

Desde Chile
Adolfo

Re: FunSwap.. no funciona en todo el sistema -ANTONIO

Posted: Wed Mar 06, 2013 11:31 am
by Adolfo
UP... nadie con algun tip ?

Re: FunSwap.. no funciona en todo el sistema -ANTONIO

Posted: Wed Mar 06, 2013 6:12 pm
by Antonio Linares
Adolfo,

Prueba a declarar "extern mydate" en los otros PRGs

Re: FunSwap.. no funciona en todo el sistema -ANTONIO

Posted: Wed Mar 06, 2013 9:22 pm
by Adolfo
Antonio

No funciono.. asi que en el apuro, cambie las 300+ llamadas a Date() por mi propia funcion.
Solucionada la urgencia, pero me gustaria haber usado la FUNSWAP(), una sola modificacion habria sido excelente.

Desde Chile
Adolfo

Re: FunSwap.. no funciona en todo el sistema -ANTONIO

Posted: Thu Mar 07, 2013 8:38 am
by Antonio Linares
Adolfo,

Yo publiqué FunSwap() en su dia solo como una prueba de concepto, pero obviamente es un hack y no hay garantía de continuidad, puesto que no es una función oficialmente soportada.

Lo que no entiendo es porque el cambio no funciona en toda la aplicación, eso es realmente extraño...

Podemos hacer algunas pruebas, para ver porque no funciona, si tienes especial interés en seguir usandola.

Re: FunSwap.. no funciona en todo el sistema -ANTONIO

Posted: Thu Mar 07, 2013 11:41 am
by Adolfo
Gracias por tu interes Antonio (como siempre)...

Este fin de semana preparo un test algo mas complejo con varios prg, asi vemos por donde esta el problema.

Desde Chile
Adolfo

Re: FunSwap.. no funciona en todo el sistema -ANTONIO

Posted: Thu Mar 07, 2013 1:09 pm
by lucasdebeltran
Amigos,

Lo que se produce con el ejemplo son unos errores de compilación en C:
Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland
swap.c:
Error E2451 swap.prg 37: Undefined symbol 'LONG' in function HB_FUN_FUNSWAP
Error E2121 swap.prg 37: Function call missing ) in function HB_FUN_FUNSWAP
Warning W8004 swap.prg 38: 'pFirst' is assigned a value that is never used in function HB_FUN_FUNSWAP


El ejemplo es sencillo:

Code: Select all

#include "FiveWin.ch"

static pOld

function Main()

   pOld := FunSwap( "TIME", "MYTIME" )

   MsgInfo( Time() ) // Hemos reemplazado la función Time() original ! :-)

return nil


function MyTime()

   local uRet := ExecPtr( pOld ) // en caso de que queramos llamar a la función original

return "now"




#pragma BEGINDUMP

#include <hbapi.h>

typedef void ( * PFUNC ) ( void );

HB_FUNC( FUNSWAP )
{
   PHB_SYMB symFirst = hb_dynsymSymbol( hb_dynsymFindName( hb_parc( 1 ) ) );
   PHB_SYMB symLast  = hb_dynsymSymbol( hb_dynsymFindName( hb_parc( 2 ) ) );
   PHB_FUNC pFirst   = symFirst->value.pFunPtr;

   symFirst->value.pFunPtr = symLast->value.pFunPtr;

   hb_retnl( ( LONG ) pFirst );
}

HB_FUNC( EXECPTR )
{
   PFUNC p = ( PFUNC ) hb_parnl( hb_pcount() );

   p();
}

#pragma ENDDUMP
 


Como son temas de C, yo me pierdo, lo siento.

Re: FunSwap.. no funciona en todo el sistema -ANTONIO

Posted: Thu Mar 07, 2013 1:20 pm
by Adolfo
Lucas

Que utilizas, xHarbour o Harbour.

Yo Uso HB3 y con el ejemplo no he tenido ningun problema... solo que el cambio de funcion se hace en el PRG desde donde se hace la llamada.

Desde Chile
Adolfo

Re: FunSwap.. no funciona en todo el sistema -ANTONIO

Posted: Thu Mar 07, 2013 2:44 pm
by lucasdebeltran
Adolfo,

Lo tienes en mi firma ;)
Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.02 [producción]
Uso el último Harbour de Fivetech. Para compilar buildh tttprg

Re: FunSwap.. no funciona en todo el sistema -ANTONIO

Posted: Fri Mar 08, 2013 10:25 am
by Antonio Linares
Lucas,

Hay que cambiar LONG por HB_LONG

A ver si con eso te compila o te da algún otro error, no estoy ahora mismo en la oficina y no puedo probarlo

Re: FunSwap.. no funciona en todo el sistema -ANTONIO

Posted: Fri Mar 08, 2013 11:50 am
by lucasdebeltran
Antonio,

Con ese cambio, funciona perfecto con BCC 5.82. Sin embargo, con MSVC2010 no admite el cambio de función, sigue mostrando time original.

En todo caso, ya no se producen errores ni de compilación ni de enlazado.

Este es el código:

Code: Select all

#include "FiveWin.ch"

static pOld

function Main()

   pOld := FunSwap( "TIME", "MYTIME" )

   MsgInfo( Time() ) // Hemos reemplazado la función Time() original ! :-)

return nil


function MYTIME

   local uRet := ExecPtr( pOld ) // en caso de que queramos llamar a la función original

return "now - function reemplazada"





#pragma BEGINDUMP

#include <hbapi.h>

typedef void ( * PFUNC ) ( void );

HB_FUNC( FUNSWAP )
{
   PHB_SYMB symFirst = hb_dynsymSymbol( hb_dynsymFindName( hb_parc( 1 ) ) );
   PHB_SYMB symLast  = hb_dynsymSymbol( hb_dynsymFindName( hb_parc( 2 ) ) );
   PHB_FUNC pFirst   = symFirst->value.pFunPtr;

   symFirst->value.pFunPtr = symLast->value.pFunPtr;

   hb_retnl( ( HB_LONG ) pFirst );
}

HB_FUNC( EXECPTR )
{
   PFUNC p = ( PFUNC ) hb_parnl( hb_pcount() );

   p();
}

#pragma ENDDUMP
 


PD. Antonio, ¿has pensado en organizar un curso de C y Harbour DE PAGO?.

Mil gracias.

Re: FunSwap.. no funciona en todo el sistema -ANTONIO

Posted: Fri Mar 08, 2013 5:01 pm
by Antonio Linares
Lucas,

No lo habia pensado, pero si un grupo de usuarios está interesado, no tengo inconveniente en impartir un curso :-)

Re: FunSwap.. no funciona en todo el sistema -ANTONIO

Posted: Fri Mar 08, 2013 8:25 pm
by Patricio Avalos Aguirre
Antonio:

Sería bueno para que lo analices

serian una buena inversion para uno..

Re: FunSwap.. no funciona en todo el sistema -ANTONIO

Posted: Sun Mar 10, 2013 12:48 am
by mantonio_08
Y EL CURSO SERIA POR QUE VIA.. ( INTERNET ) O VIA CURSO ESCRITO. ??