Page 1 of 1

Rutinas en C++ en FHW

Posted: Thu Jul 06, 2006 12:07 am
by alex_cyr
Que tal tengo una pregunta, puedo poner una rutina en C++ emebebida en mi programa de FWH o tengo que hacer su equivalencia a Borland C, talvez es una pregunta obvia pero no tengo idea de esto gracias...

Posted: Thu Jul 06, 2006 11:01 am
by Antonio Linares
Alex,

Puedes usar C++ siempre que llames a Borland C con el parámetro -P para forzar la compilación en C++. Aqui tienes un ejemplo:

Code: Select all

// Using C++ with Harbour 
// sample developed by FiveTech Software

function Main()

   local oTest := Test() // We create a C++ object

   XMSGINFO( TEST_IVALUE( oTest ) ) // We retrieve a C++ object data
   
return nil

#pragma BEGINDUMP

#include <hbapi.h>

class Sample
{
   public:
      int iValue;
      Sample();
};

Sample::Sample()
{
   iValue = 123;
}   

HB_FUNC( TEST )   
{
   Sample * p = new Sample;
   
   hb_retnl( ( unsigned long ) p );
}

HB_FUNC( TEST_IVALUE )
{
   hb_retnl( ( ( Sample * ) hb_parnl( 1 ) )->iValue );
}   

extern "C" 
{
   HB_FUN_MSGINFO( void );
}

HB_FUNC( XMSGINFO )
{
   HB_FUN_MSGINFO();
}   

#pragma ENDDUMP  

Posted: Fri Jul 07, 2006 12:46 am
by alex_cyr
Gracias Antonio, funciona perfecto :wink:

Posted: Mon Jul 31, 2006 7:54 pm
by Antonio Linares
_,

Sólo tienes que cambiar esto en samples\buildh.bat:

%bcdir%\bin\bcc32 -M -c -P @b32.bc

Posted: Wed Aug 02, 2006 3:21 pm
by MarioG
Disculpen el O.T.; no se nada de C
Se puede leer lo sigiuente de un archivo .rc (si el contenido fuera C), desde nuestros .prg?

Code: Select all

1 VERSIONINFO 
FILEVERSION 2, 52, 25
PRODUCTVERSION 2, 52, 25
{
 BLOCK "StringFileInfo"
 {
  BLOCK "040904E4"
  {
   VALUE "Author", "Ing. Mario González\000"
   VALUE "CompanyName", "Ideas & Desarrollos\000"
   VALUE "FileDescription", "Bancos & Recursos\000"
   VALUE "FileVersion", "rev.2.52.25 (build 07/06)\000"
   VALUE "InternalName", "mgbyr\000"
   VALUE "LegalCopyright", "I&D © 1989-2006\000"
   VALUE "ProductName", "Bancos & Recursos\000"
   VALUE "ProductVersion", "rev.2.52.25 (build 07/06)\000"
   VALUE "OriginalFilename", "mgbyr.exe\000"
  }

 }

 BLOCK "VarFileInfo"
 {
  VALUE "Translation", 2048, 1200
 }

}
gracias

Posted: Wed Aug 02, 2006 6:16 pm
by Antonio Linares
Mario,

Se hace como se describe en esta página:
http://vcfaq.mvps.org/sdk/3.htm

Vamos a construir un ejemplo.

Posted: Thu Aug 03, 2006 6:30 am
by Antonio Linares
Mario,

Aquí está el ejemplo, desarrollado por un buen amigo nuestro y usando un RC desarrollado por nosotros con el editor de recursos de PellesC:

http://hyperupload.com/download/0211476 ... r.zip.html

Posted: Thu Aug 03, 2006 11:40 am
by MarioG
Muchas gracias!, hace mucho que lo esperaba

Posted: Sat Aug 05, 2006 9:26 pm
by Antonio Linares
En relación a C++, gracias a las nuevas mejoras en Harbour ya es posible mezclar C y C++ libremente. Esta capacidad aún no está implementada en xHarbour.

Aqui tienen un ejemplo de como se usa ahora:

Code: Select all

// Using C++ with Harbour 
// sample developed by FiveTech Software

function Main()

   local oTest := Test() // We create a C++ object

   MsgInfo( TEST_IVALUE( oTest ) ) // We retrieve a C++ object data
   
return nil

#pragma BEGINDUMP

#include <hbapi.h>

class Sample
{
   public:
      int iValue;
      Sample();
};

Sample::Sample()
{
   iValue = 123;
}   

HB_FUNC( TEST )   
{
   Sample * p = new Sample;
   
   hb_retnl( ( unsigned long ) p );
}

HB_FUNC( TEST_IVALUE )
{
   hb_retnl( ( ( Sample * ) hb_parnl( 1 ) )->iValue );
}   

#pragma ENDDUMP  

Posted: Sun Aug 06, 2006 4:29 pm
by Antonio Linares
_,

Eso es lo que hace ahora Harbour automaticamente, pero con todos los símbolos que genera de todos los PRGs y módulos en C/C++.

Posted: Tue Aug 29, 2006 7:50 pm
by goosfancito
Antonio Linares wrote:Alex,

Puedes usar C++ siempre que llames a Borland C con el parámetro -P para forzar la compilación en C++. Aqui tienes un ejemplo:

Code: Select all

// Using C++ with Harbour 
// sample developed by FiveTech Software

function Main()

   local oTest := Test() // We create a C++ object

   XMSGINFO( TEST_IVALUE( oTest ) ) // We retrieve a C++ object data
   
return nil

#pragma BEGINDUMP

#include <hbapi.h>

class Sample
{
   public:
      int iValue;
      Sample();
};

Sample::Sample()
{
   iValue = 123;
}   

HB_FUNC( TEST )   
{
   Sample * p = new Sample;
   
   hb_retnl( ( unsigned long ) p );
}

HB_FUNC( TEST_IVALUE )
{
   hb_retnl( ( ( Sample * ) hb_parnl( 1 ) )->iValue );
}   

extern "C" 
{
   HB_FUN_MSGINFO( void );
}

HB_FUNC( XMSGINFO )
{
   HB_FUN_MSGINFO();
}   

#pragma ENDDUMP  
Antonio,

Si tengo un simple .cpp con este código:

Code: Select all

#include "hbapi.h"

//------------------------------------------------------------------------------
 
class sample {
   public:
      int iValue;
      sample();
      mostrar();
   };
 
//------------------------------------------------------------------------------
 
sample:: sample() {
   iValue= 123;
   }
 
//------------------------------------------------------------------------------
 
sample:: mostrar() {
 
   // Aca quiero que me retorne el valor "123"
 
   }
 
//------------------------------------------------------------------------------


y quiero desde FWH poder usar esa clase, como hago?

Estoy tratando de entender el mecanismo pero no lo logro ver con las clases. gracias

Posted: Wed Aug 30, 2006 4:15 pm
by goosfancito
Gracias amigo.

Sirvio,
_ wrote:Gustavo haber si te sirve esto

Main.prg

Code: Select all

#include "Fivewin.ch"
/*-----------------------------------------------------------------------------------------------*/
FUNCTION Main()
   LOCAL oCpp
   MsgInfo( "Hola Mundo desde xHarbour" )
   MsgInfo( MENSAJEC() )
   MsgInfo( MENSAJECPP() )
   oCpp := CreateSample()
   ? SampleMostrar( oCpp )
   RETURN NIL
Testc.c

Code: Select all

#include <hbapi.h>

HB_FUNC( MENSAJEC ){
   hb_retc( "hola mundo desde c" );
}
Testcpp.cpp

Code: Select all

#include <hbapi.h>

extern "C" HB_FUNC( MENSAJECPP ){
   hb_retc( "hola mundo desde c++" );
}

class sample {
   public:
      int iValue;
      sample();
      mostrar();
   };

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

sample:: sample() {
   iValue = 123;
   }

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

sample:: mostrar() {
   return iValue;
   }

extern "C" HB_FUNC( CREATESAMPLE ){
   sample * p = new sample;
   hb_retnl( ( unsigned long ) p );
}

extern "C" HB_FUNC( SAMPLEMOSTRAR ){
   hb_retni( ( ( sample * ) hb_parnl( 1 ) ) -> mostrar() );
}
salu2