FunSwap.. no funciona en todo el sistema -ANTONIO

Post Reply
User avatar
Adolfo
Posts: 815
Joined: Tue Oct 11, 2005 11:57 am
Location: Chile
Contact:

FunSwap.. no funciona en todo el sistema -ANTONIO

Post 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
;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Lenovo Legion Y520, 16GB Ram, 1 TB NVME M.2, 1 TB SSD, GTX 1050
User avatar
Adolfo
Posts: 815
Joined: Tue Oct 11, 2005 11:57 am
Location: Chile
Contact:

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

Post by Adolfo »

UP... nadie con algun tip ?
;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Lenovo Legion Y520, 16GB Ram, 1 TB NVME M.2, 1 TB SSD, GTX 1050
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

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

Post by Antonio Linares »

Adolfo,

Prueba a declarar "extern mydate" en los otros PRGs
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Adolfo
Posts: 815
Joined: Tue Oct 11, 2005 11:57 am
Location: Chile
Contact:

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

Post 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
;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Lenovo Legion Y520, 16GB Ram, 1 TB NVME M.2, 1 TB SSD, GTX 1050
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

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

Post 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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Adolfo
Posts: 815
Joined: Tue Oct 11, 2005 11:57 am
Location: Chile
Contact:

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

Post 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
;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Lenovo Legion Y520, 16GB Ram, 1 TB NVME M.2, 1 TB SSD, GTX 1050
User avatar
lucasdebeltran
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am
Contact:

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

Post 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.
Muchas gracias. Many thanks.

Un saludo, Best regards,

Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]

Implementando MSVC 2010, FWH64 y ADO.

Abandonando uso xHarbour y SQLRDD.
User avatar
Adolfo
Posts: 815
Joined: Tue Oct 11, 2005 11:57 am
Location: Chile
Contact:

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

Post 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
;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Lenovo Legion Y520, 16GB Ram, 1 TB NVME M.2, 1 TB SSD, GTX 1050
User avatar
lucasdebeltran
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am
Contact:

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

Post 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
Muchas gracias. Many thanks.

Un saludo, Best regards,

Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]

Implementando MSVC 2010, FWH64 y ADO.

Abandonando uso xHarbour y SQLRDD.
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

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

Post 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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
lucasdebeltran
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am
Contact:

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

Post 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.
Muchas gracias. Many thanks.

Un saludo, Best regards,

Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]

Implementando MSVC 2010, FWH64 y ADO.

Abandonando uso xHarbour y SQLRDD.
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

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

Post by Antonio Linares »

Lucas,

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

Antonio Linares
www.fivetechsoft.com
User avatar
Patricio Avalos Aguirre
Posts: 1028
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile
Contact:

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

Post by Patricio Avalos Aguirre »

Antonio:

Sería bueno para que lo analices

serian una buena inversion para uno..
Saludos
Patricio

__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
mantonio_08
Posts: 330
Joined: Fri May 25, 2007 9:06 pm

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

Post by mantonio_08 »

Y EL CURSO SERIA POR QUE VIA.. ( INTERNET ) O VIA CURSO ESCRITO. ??
Post Reply