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

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