Page 1 of 1

chr( 0 ) devuelto desde Funcion Harb

PostPosted: Fri Mar 03, 2006 12:01 pm
by goosfancito
Antonio,

En una oportunidad me respondiste a un problema que tengo con respecto a esto "hola " + chr( 0 ) + chr( 0 ) + "adios",
o sea, los chr( 0 ) con respecto a este mismo tema, Te mando un proyecto en el cual desde
Har se llama a una función que esta en C y desde esa funcion se llama a otra que esta en HAR,
la cual dicha funcion solo devuelve el contenido de una cadena.
Fijate, por favor, que cuando devuelve el contenido Return ( cRespuesta ) y
la toma nueavamente el C dicha cadena tiene solamente lo que esta antes del chr( 0 ),
lo que me indicaria que corta nuevamente la cadena, o por lo menos los restantes caracteres
no los estaria pasando.

Podrias indicarme como encarar el tema? porque la verdad necesito que se hagan esos pasos.
Llamadas desde Har a funciones de C que devuelven cadenas que contienen el
dichoso chr( 0 ).

Muchas Gracias.

Esto seria lo de har:
Code: Select all  Expand view
#include "fivewin.ch"

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

FUNCTION main( )

   LLAMADAHAR("GUSTAVO")

   RETURN ( NIL )


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

FUNCTION FUNCION_HAR( cComando )

   LOCAL cRespuesta:= "hola " + Chr( 0 ) + Chr( 0 ) + "Adios"

   RETURN ( cRespuesta )



Esto seria lo de .c


Code: Select all  Expand view
#include "winten.h"
#include "hbapi.h"
#include "windows.h"
#include "winten.h"
#include "hbapi.h"
#include "windows.h"
#include "hbvm.h"
#include "string.h"
#include "math.h"


HB_FUNC ( LLAMADAHAR ){

   char *comando = hb_parcx(1);
   char *respuesta;

   hb_vmPushSymbol( hb_dynsymGet( "FUNCION_HAR") -> pSymbol );
   hb_vmPushNil( );
   hb_vmPushString( comando, strlen( comando ) );
   hb_vmFunction( 1 );

   respuesta = hb_parc( -1 );

   MessageBox(0, respuesta,  "Contenido que devuelve funcion HAR", MB_OK);

}

PostPosted: Fri Mar 03, 2006 6:46 pm
by Antonio Linares
Gustavo,

Tu código está bien. Es MessageBox() de Windows quien no te muestra los ceros. Haz lo siguiente y lo verás:
Code: Select all  Expand view
respuesta = hb_parc( -1 ) + 7;

A partir del 7 byte, está "Adios"

PostPosted: Fri Mar 03, 2006 6:53 pm
by goosfancito
Antonio,

La cosa parece ser no tan sencilla, probe lo que me dijiste igual que el ejemplo que me habias enviado. pero si tomas de ese codigo lo que trae la variable cRespuesta por lo menos a mi no me trae toda la cadena. O yo estoy loco.

PostPosted: Fri Mar 03, 2006 10:21 pm
by Antonio Linares
Has probado a llamar a MessageBox() con el valor que te he indicado ?

PostPosted: Mon Mar 06, 2006 12:59 pm
by goosfancito
Antonio,

Si, si pones + 7 Muestra Adios, pero necesito que muestre "hola y adios", o sea toda la cadena que se le pasa. no solamente la segunda parte.

Es mas, en este caso es "hola" + chr( 0 ) + chr( 0 ) + "Adios" pero si sería asi:
Code: Select all  Expand view
"hola" + chr( 0 ) + chr( 0 ) + "Adios"  + chr( 0 ) + chr( 0 ) + "De nuevo por aca?"


Como tendría que hacer?

Para Antonio

PostPosted: Tue Mar 07, 2006 11:38 am
by goosfancito
Antonio,

Estamos desarrollando un proyecto el cual esto es muy importante.
Se puede de alguna manera generar esa cadena y tomarla desde funciones tantos C como xHar?


Gracias.

PostPosted: Tue Mar 07, 2006 12:40 pm
by Antonio Linares
Gustavo,

Si necesitas usar MessageBox() para mostrar cadenas que contengan ceros, podrias cambiar los ceros por Chr( 255 ) y dejar solo el cero del final de cadena.

PostPosted: Tue Mar 07, 2006 8:42 pm
by goosfancito
Antonio,

Desde ya gracias por todo el tiempo que me estas dando, no necesito mostrar dicha cadena sino que necesito que esa cadena sea almacenada en una variable, para luego tratarla, en si la cadena guarda un contenido y luego tengo que ir tomando partes de ella (con substr(... ) ) para realizar diferentes tareas.

El tema es que cuando quise realizar esto no lo pude hacer ya que la cadena me llegaba cortada a la variable que la pasaba.

si me permitis te envio a tu correo personal las rutinas para que observer el trabajo que necesito hacer.