FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour llamar a una funci贸n de Harbour desde C
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
llamar a una funci贸n de Harbour desde C
Posted: Sat Dec 17, 2011 01:54 PM
Hola,

Me gustar铆a desde un c贸digo C llamar a una funci贸n m铆a de Harbour y pasarle una cadena de texto.

Es decir, lo contrario a esto:

Code (fw): Select all Collapse
procedure main()
  msgalert(pasa1())  
return


#pragma BEGINDUMP

#include "hbapi.h"
#include "windows.h"

HB_FUNC( PASA1 )
{
 

  hb_retc(  "cadena desde el codigo c!!" );

}


#pragma ENDDUMP



Much铆simas 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: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: llamar a una funci贸n de Harbour desde C
Posted: Sat Dec 17, 2011 02:37 PM
Hola

pienso que esta seria la forma mas rapida...

cambia tu funcion de C en harbour a otra funcion y luego llamas a esta otra con tu funcion de Harbour ( como una especie de wrapper )

ejemplo

Code (fw): Select all Collapse
#include "fivewin.ch"
procedure main()
  msgalert(pasa1(1))  
  msgalert(pasa1(2))  
return


#pragma BEGINDUMP

#include "hbapi.h"
#include "windows.h"

char * pasa1( char * c )
{
   return c;
}

HB_FUNC( PASA1 )
{
  char * c ;
  int i = hb_parni(1);
  
  if ( i == 1 )
     c = pasa1( "cadena desde el codigo c!!" );
  else
     c = pasa1( "otra cadena" );
     
  hb_retc( c );
}

#pragma ENDDUMP
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: llamar a una funci贸n de Harbour desde C
Posted: Sat Dec 17, 2011 03:10 PM
Hola Daniel,

Creo que me expliqu茅 mal.

To tengo una funci贸n en Harbour, por ejemplo:

Code (fw): Select all Collapse
function lucas()

select("lucas")
append blank
replace field->name with "lucas"

bla bla bla

return nil




Yo lo que quiero es llamar a esa funci贸n de Harbour lucas() desde un c贸digo en C y no se c贸mo.

Muchas gracias nuevamente,

Salu2
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: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: llamar a una funci贸n de Harbour desde C
Posted: Sat Dec 17, 2011 04:05 PM
Lucas

el api de harbour nos permite hacer lo que quieres de una forma muy simple

Code (fw): Select all Collapse
#include "fivewin.ch"
procedure main()
   
   pasa1()
   
return


function pasa2( c )

   MsgInfo( c )

return nil


#pragma BEGINDUMP

#include "hbapi.h"
#include "windows.h"
#include "hbapiitm.h"


HB_FUNC( PASA1 )
{
   PHB_ITEM pArg = hb_itemNew( NULL );
   
   hb_itemPutC( pArg, "LLamada desde C" );
   
   hb_itemDoC( "pasa2", 1, pArg ); // nombre de la funcion en PRG, 
                                   // total de parametros a pasar, 
                                   // lista de items
   
   hb_itemRelease( pArg );

}

#pragma ENDDUMP
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: llamar a una funci贸n de Harbour desde C
Posted: Sat Dec 17, 2011 05:37 PM

Muchas gracias Daniel.

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: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: llamar a una funci贸n de Harbour desde C
Posted: Sun Dec 18, 2011 09:42 PM
Hola de nuevo Daniel,

驴Y desde una funci贸n pura de C?.

Por ejemplo:
Code (fw): Select all Collapse
#include <Windows.h>
#include <hbapi.h>

#define IF(x,y,z) ((x)?(y):(z))
    
//----------------------------------------------------------------------------//

LPSTR StrToken( LPSTR szText, WORD wOcurrence, BYTE bSeparator, LPWORD pwLen )
{
   WORD wStart, wEnd = 0, wCounter = 0;

   if( ! bSeparator )
     bSeparator = ' ';

   do {
      wStart = wEnd;

      if( bSeparator != ' ' )
      {
         if( szText[ wStart ] == bSeparator )
            wStart++;
      }
      else
      {
         while( szText[ wStart ] && szText[ wStart ] == bSeparator )
            wStart++;
      }

      if( szText[ wStart ] && szText[ wStart ] != bSeparator )
      {
         wEnd = wStart + 1;

         while( szText[ wEnd ] && szText[ wEnd ] != bSeparator )
            wEnd++;
      }
      else
         wEnd = wStart;

   } while( wCounter++ < wOcurrence - 1 && szText[ wEnd ] );

   * pwLen = wEnd - wStart;

   if( wCounter < wOcurrence )
      * pwLen = 0;

   return szText + wStart;
}

//----------------------------------------------------------------------------//



Prob茅 con hb_itemDoC( "pasa2", 1, "la cadena" ); pero no funciona.

Adem谩s, salta error de function with no prototype.

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: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: llamar a una funci贸n de Harbour desde C
Posted: Mon Dec 19, 2011 09:15 AM
Tienes que usar la misma secuencia que te ha indicado Daniel:

Code (fw): Select all Collapse
#include <hbapi.h>
#include <hbapiitm.h>

static void Pasa1()
{
聽 聽PHB_ITEM pArg = hb_itemNew( NULL );
聽 聽
聽 聽hb_itemPutC( pArg, "LLamada desde C" );
聽 聽
聽 聽hb_itemDoC( "pasa2", 1, pArg ); // nombre de la funcion en PRG, 
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// total de parametros a pasar, 
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// lista de items
聽 聽
聽 聽hb_itemRelease( pArg );
}

Desde tu c贸digo en C llamas a :

Pasa1();
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: llamar a una funci贸n de Harbour desde C
Posted: Mon Dec 19, 2011 10:44 AM

Antonio,

Muchas gracias, pero es que desde el C贸digo C puro tengo que enviar un texto a una funci贸n en Harbour.

Si llamo desde el c贸digo C a otra funci贸n intermedia en C no me sirve, porque en el c贸digo primario en C puro y duro es donde tengo que enviar el texto.

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: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: llamar a una funci贸n de Harbour desde C
Posted: Mon Dec 19, 2011 11:08 AM
Lucas...

es exactamente igual...

lucasdebeltran wrote:Adem谩s, salta error de function with no prototype.


te falta el archivo de cabecera hbapiitm.h (esta en el ejemplo que te puse)

como te recuerda Antonio, hay que seguir la misma secuencia...

voy a ser un poco mas explicativo

para usar de la funcion hb_itemDoC, el paso de parametros debe ser datos tipo PHB_ITEM y asignarles el valor deseado
en el siguiente ejemplo te muestro como enviar un string y como enviar un numero, desde C "puro" a nivel PRG

Code (fw): Select all Collapse
#include "fivewin.ch"
procedure main()
   
   pasa1()
   
return


function pasa2( c, n )

   ? "Un texto", c
   ? "Ahora Un Numero", n

return nil


#pragma BEGINDUMP

#include "hbapi.h"
#include "windows.h"
#include "hbapiitm.h"


void desdeCpuro( void )
{
   PHB_ITEM pArg1 = hb_itemNew( NULL );
   PHB_ITEM pArg2 = hb_itemNew( NULL );
   
   hb_itemPutC( pArg1, "LLamada desde C" );
   hb_itemPutNI( pArg2, 1234 );
   
   hb_itemDoC( "pasa2", 2, pArg1, pArg2 ); // nombre de la funcion en PRG, 
                                           // total de parametros a pasar, 
                                           // lista de items
   
   hb_itemRelease( pArg1 );
   hb_itemRelease( pArg2 );

}

HB_FUNC( PASA1 )
{
   desdeCpuro();
}

#pragma ENDDUMP
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: llamar a una funci贸n de Harbour desde C
Posted: Mon Dec 19, 2011 12:42 PM

Gracias a ambos, va perfecto.

Una cosa, 驴ten茅is pensado hacer seminarios de FWH como hac铆a el p谩jaro de Ren茅 Flores?.

Un saludo

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: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: llamar a una funci贸n de Harbour desde C
Posted: Mon Dec 19, 2011 02:03 PM

Estamos abiertos a cualquier propuesta que sea interesante.

No hay problema en hacer seminarios si se reunen un cierto numero de usuarios de FWH interesados

regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion