FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour As byte
Posts: 682
Joined: Tue Feb 14, 2006 09:48 AM
As byte
Posted: Thu Sep 17, 2009 07:59 AM
Estoy usando un control activeX, y necesito llamar un metodo y pasarle un parmetro, dicho parametro espera recibirlo del tipo array de bytes (ByRef aRawData() As Byte) ).

Alguna idea para pasarselo desde harbour.
El parametro es el contenido de un fichero binario.
En VB se hace de la siguiente forma:
Code (fw): Select all Collapse
Dim blob() As Byte
聽' Read binary data from file.
聽Open CommonDialog1.FileName For Binary As #1
聽ReDim blob(LOF(1))
聽Get #1, , blob()
聽Close #1
聽Templ.Deserialize blob

Esto mismo desde harbour y pasandole como parametro el contenido del fichero leido con fRead, no funciona.

Si con el propio activex, ejecuto serialize y lo muevo a una variable, y despues la paso al activex si funciona.
Code (fw): Select all Collapse
cTmp:= oAx:Serialize()
oAx:DeSearialize( cTmp ) //Ok

Cualquier otro parametro leido desde fichero, de otra variable, etc no fucniona, aunque en teoria son "identicos" en tama帽o, etc.
Saludos desde Mallorca
Biel Maim贸
http://bielsys.blogspot.com/
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: As byte
Posted: Fri Sep 18, 2009 05:18 PM
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 601
Joined: Wed Jul 04, 2007 03:51 PM
Re: As byte
Posted: Sat Sep 19, 2009 11:40 PM

Hola...
Perd贸n por entrar a este post con otro tema...
Escribo para comentarle a Biel que estuve mirando su blog y dej茅 un comentario en el topic de Compresi贸n y descrompresi贸n de ficheros Zip...
Tuve algunos problemitas con sus funciones, y quiz谩 amablemente podr铆a darme una mano.
Desde ya muchas gracias, y nuevamente disculpas.
Saludos,

Ojeda Esteban Eduardo.

Buenos Aires - Argentina.

FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport

Skype: jreduojeda
Posts: 682
Joined: Tue Feb 14, 2006 09:48 AM
Re: As byte
Posted: Mon Sep 21, 2009 10:49 AM

Esteban, te he contestado en el blog.

Saludos desde Mallorca
Biel Maim贸
http://bielsys.blogspot.com/
Posts: 682
Joined: Tue Feb 14, 2006 09:48 AM
Re: As byte
Posted: Mon Sep 21, 2009 10:59 AM
Antonio Linares wrote:Biel,

This is obvious, but have you tried it in this order ?
Code (fw): Select all Collapse
oTmp:Deserialize( xVar2) //Crash
oTmp:Deserialize( xVar1) //Runs Ok

No funciona cambiando el orden, el control activex casca al pasarle el parametro, el parametro no es del tipo esperado y produce un error.
El tema es que una variable harbour es capaz de contener un valor valido, pero desde Harbour soy incapaz de genera ese tipo de dato.
No habria alguna manera desde una funcion de C retornar un tipo as byte, y colocarlo en una variable Harbour.
Saludos desde Mallorca
Biel Maim贸
http://bielsys.blogspot.com/
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: As byte
Posted: Mon Sep 21, 2009 12:37 PM
Hola Biel...

No he probado esto, pero puedes intentar de esta manera...

Code (fw): Select all Collapse
....
Serialize( oAx, xVal )
...

#pragma BEGINDUMP

#include <hbapi.h>
#include <hbvm.h> 


HB_FUNC( SERIALIZE ) 
{ 
聽 聽PHB_ITEM pObj 聽= hb_param( 1, HB_IT_OBJECT );
聽 聽PHB_ITEM pStr 聽= hb_param( 2, HB_IT_STRING );

聽 聽hb_vmPushSymbol( hb_dynsymGetSymbol( "SERIALIZE" ) ); 
聽 聽hb_vmPush( pObj ); 
聽 聽hb_vmPush( pStr );
聽 聽hb_vmFunction( 1 ); 

} 

#pragma ENDDUMP
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: As byte
Posted: Mon Sep 21, 2009 01:21 PM

Biel,

Que ActiveX es ? Hay demo de 茅l ?

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: As byte
Posted: Mon Sep 21, 2009 01:52 PM
Biel,

Pensando en el asunto, has probado esto ?
Code (fw): Select all Collapse
xVar2 := xVar1
oTmp:Deserialize( xVar2 )
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 682
Joined: Tue Feb 14, 2006 09:48 AM
Re: As byte
Posted: Tue Sep 22, 2009 04:14 PM
Daniel Garcia-Gil wrote:Hola Biel...

No he probado esto, pero puedes intentar de esta manera...

Code (fw): Select all Collapse
....
Serialize( oAx, xVal )
...

#pragma BEGINDUMP

#include <hbapi.h>
#include <hbvm.h> 


HB_FUNC( SERIALIZE ) 
{ 
聽 聽PHB_ITEM pObj 聽= hb_param( 1, HB_IT_OBJECT );
聽 聽PHB_ITEM pStr 聽= hb_param( 2, HB_IT_STRING );

聽 聽hb_vmPushSymbol( hb_dynsymGetSymbol( "SERIALIZE" ) ); 
聽 聽hb_vmPush( pObj ); 
聽 聽hb_vmPush( pStr );
聽 聽hb_vmFunction( 1 ); 

} 

#pragma ENDDUMP

Hola Daniel, gracias por tu sugerencia, lo he probado y da el mismo error que si le paso al activex una cadena de caracteres.
Saludos desde Mallorca
Biel Maim贸
http://bielsys.blogspot.com/
Posts: 682
Joined: Tue Feb 14, 2006 09:48 AM
Re: As byte
Posted: Tue Sep 22, 2009 04:16 PM
Antonio Linares wrote:Biel,

Pensando en el asunto, has probado esto ?
Code (fw): Select all Collapse
xVar2 := xVar1
oTmp:Deserialize( xVar2 )

Si, esto lo habia probado y funciona ok.
Intentare enviarte el Activex.
Saludos desde Mallorca
Biel Maim贸
http://bielsys.blogspot.com/
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: As byte
Posted: Tue Sep 22, 2009 05:19 PM
Biel,

Me parece que es un bug generado entre el soporte de OLE y el ItemApi. Te explico mis razones:

1. El valor que viene devuelto del ActiveX se pasa de Variant a Item de Harbour/xHarbour usando: hb_oleVariantToItem()

2. Puesto que es de tipo "C", se ha llamado a la funci贸n hb_itemPutCPtr():
Code (fw): Select all Collapse
      case VT_BSTR:
      {
         char* szString = WideToAnsi( pVariant->n1.n2.n3.bstrVal );
         hb_itemPutCPtr( pItem, szString );
         break;
      }


3. Y el bug finalmente se produce por contener ceros la cadena, en estas l铆neas de hb_itemPutCPtr():
Code (fw): Select all Collapse
   ulLen = szText ? strlen( szText ) : 0; // no se deberia usar strlen() pues no reconoce ceros dentro de la cadena
   pItem->item.asString.length = ulLen; // incorrecto! 
   ...
  pItem->item.asString.value     = szText; // el puntero se asigna tal cual, luego conserva todos los bytes

Resumiendo: el contenido del item cadena y su longitud no se corresponden

Hay que reportarlo a las listas de Harbour y xHarbour para que se verifique este bug y en caso afirmativo, que se corrija.

Y gracias a ti por haberlo puesto de manifiesto :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: As byte
Posted: Tue Sep 22, 2009 05:33 PM
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: As byte
Posted: Wed Sep 23, 2009 12:29 AM
Biel,

Este cambio en olecore.c deberia solucionar el bug:
Code (fw): Select all Collapse
      case VT_BSTR:
      {
         char* szString = WideToAnsi( pVariant->n1.n2.n3.bstrVal );
         hb_itemPutCLPtr( pItem, szString, WideCharToMultiByte(
CP_ACP, 0, pVariant->n1.n2.n3.bstrVal, -1, NULL, 0, NULL, NULL ) );
         break;
      }
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 682
Joined: Tue Feb 14, 2006 09:48 AM
Re: As byte
Posted: Wed Sep 23, 2009 02:14 PM

Muchas gracias Antonio por el tiempo dedicado, para mi hubiera sido imposible localizarlo.
No he podido comprobar el funcionamiento, hoy salgo de viaje, pero cuando regrese de Andorra, interar compilar los cambios y te comento.

Saludos desde Mallorca
Biel Maim贸
http://bielsys.blogspot.com/
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: As byte
Posted: Wed Sep 23, 2009 04:12 PM

Biel,

El bug fu茅 arreglado unos dias antes en el propio repositorio de Harbour :-)

Solo hay que volver a construir un nuevo build de Harbour y listo :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion