FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour FunSwap.. no funciona en todo el sistema -ANTONIO
Posts: 883
Joined: Tue Oct 11, 2005 11:57 AM
FunSwap.. no funciona en todo el sistema -ANTONIO
Posted: Tue Mar 05, 2013 01:15 PM
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 (fw): Select all Collapse
//------------------------------------------------------------
#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
----------
Asus TUF F15, 32GB Ram, 2 * 1 TB NVME M.2, GTX 1650
Posts: 883
Joined: Tue Oct 11, 2005 11:57 AM
Re: FunSwap.. no funciona en todo el sistema -ANTONIO
Posted: Wed Mar 06, 2013 11:31 AM

UP... nadie con algun tip ?

;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Asus TUF F15, 32GB Ram, 2 * 1 TB NVME M.2, GTX 1650
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: FunSwap.. no funciona en todo el sistema -ANTONIO
Posted: Wed Mar 06, 2013 06:12 PM

Adolfo,

Prueba a declarar "extern mydate" en los otros PRGs

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 883
Joined: Tue Oct 11, 2005 11:57 AM
Re: FunSwap.. no funciona en todo el sistema -ANTONIO
Posted: Wed Mar 06, 2013 09:22 PM

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
----------
Asus TUF F15, 32GB Ram, 2 * 1 TB NVME M.2, GTX 1650
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: FunSwap.. no funciona en todo el sistema -ANTONIO
Posted: Thu Mar 07, 2013 08:38 AM

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
Posts: 883
Joined: Tue Oct 11, 2005 11:57 AM
Re: FunSwap.. no funciona en todo el sistema -ANTONIO
Posted: Thu Mar 07, 2013 11:41 AM

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
----------
Asus TUF F15, 32GB Ram, 2 * 1 TB NVME M.2, GTX 1650
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: FunSwap.. no funciona en todo el sistema -ANTONIO
Posted: Thu Mar 07, 2013 01:09 PM
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 (fw): Select all Collapse
#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.
Posts: 883
Joined: Tue Oct 11, 2005 11:57 AM
Re: FunSwap.. no funciona en todo el sistema -ANTONIO
Posted: Thu Mar 07, 2013 01:20 PM

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
----------
Asus TUF F15, 32GB Ram, 2 * 1 TB NVME M.2, GTX 1650
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: FunSwap.. no funciona en todo el sistema -ANTONIO
Posted: Thu Mar 07, 2013 02:44 PM
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.
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: FunSwap.. no funciona en todo el sistema -ANTONIO
Posted: Fri Mar 08, 2013 10:25 AM

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
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: FunSwap.. no funciona en todo el sistema -ANTONIO
Posted: Fri Mar 08, 2013 11:50 AM
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 (fw): Select all Collapse
#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.
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: FunSwap.. no funciona en todo el sistema -ANTONIO
Posted: Fri Mar 08, 2013 05:01 PM

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
Posts: 1074
Joined: Fri Oct 07, 2005 01:56 PM
Re: FunSwap.. no funciona en todo el sistema -ANTONIO
Posted: Fri Mar 08, 2013 08:25 PM

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
Posts: 330
Joined: Fri May 25, 2007 09:06 PM
Re: FunSwap.. no funciona en todo el sistema -ANTONIO
Posted: Sun Mar 10, 2013 12:48 AM

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

Continue the discussion