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. ??