llamar a una función de Harbour desde C

llamar a una función de Harbour desde C

Postby lucasdebeltran » Sat Dec 17, 2011 1: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: Select all  Expand view

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.
User avatar
lucasdebeltran
 
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am

Re: llamar a una función de Harbour desde C

Postby Daniel Garcia-Gil » Sat Dec 17, 2011 2: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: Select all  Expand view

#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
 
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: llamar a una función de Harbour desde C

Postby lucasdebeltran » Sat Dec 17, 2011 3:10 pm

Hola Daniel,

Creo que me expliqué mal.

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

Code: Select all  Expand view
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.
User avatar
lucasdebeltran
 
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am

Re: llamar a una función de Harbour desde C

Postby Daniel Garcia-Gil » Sat Dec 17, 2011 4:05 pm

Lucas

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

Code: Select all  Expand view


#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
 
 
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: llamar a una función de Harbour desde C

Postby lucasdebeltran » Sat Dec 17, 2011 5: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.
User avatar
lucasdebeltran
 
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am

Re: llamar a una función de Harbour desde C

Postby lucasdebeltran » Sun Dec 18, 2011 9:42 pm

Hola de nuevo Daniel,

¿Y desde una función pura de C?.

Por ejemplo:
Code: Select all  Expand view
#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.
User avatar
lucasdebeltran
 
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am

Re: llamar a una función de Harbour desde C

Postby Antonio Linares » Mon Dec 19, 2011 9:15 am

Tienes que usar la misma secuencia que te ha indicado Daniel:

Code: Select all  Expand view
#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
User avatar
Antonio Linares
Site Admin
 
Posts: 41921
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: llamar a una función de Harbour desde C

Postby lucasdebeltran » 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.
User avatar
lucasdebeltran
 
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am

Re: llamar a una función de Harbour desde C

Postby Daniel Garcia-Gil » 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: Select all  Expand view

#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
 
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: llamar a una función de Harbour desde C

Postby lucasdebeltran » 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.
User avatar
lucasdebeltran
 
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am

Re: llamar a una función de Harbour desde C

Postby Antonio Linares » Mon Dec 19, 2011 2: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
User avatar
Antonio Linares
Site Admin
 
Posts: 41921
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 32 guests