As byte

As byte

Postby Biel EA6DD » Thu Sep 17, 2009 7: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: Select all  Expand view

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: Select all  Expand view

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/
User avatar
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Re: As byte

Postby Antonio Linares » Fri Sep 18, 2009 5:18 pm

regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41858
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: As byte

Postby jrestojeda » 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
User avatar
jrestojeda
 
Posts: 601
Joined: Wed Jul 04, 2007 3:51 pm
Location: Buenos Aires - Argentina

Re: As byte

Postby Biel EA6DD » Mon Sep 21, 2009 10:49 am

Esteban, te he contestado en el blog.
Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
User avatar
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Re: As byte

Postby Biel EA6DD » Mon Sep 21, 2009 10:59 am

Antonio Linares wrote:Biel,

This is obvious, but have you tried it in this order ?
Code: Select all  Expand view

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/
User avatar
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Re: As byte

Postby Daniel Garcia-Gil » Mon Sep 21, 2009 12:37 pm

Hola Biel...

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

Code: Select all  Expand view

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

Re: As byte

Postby Antonio Linares » Mon Sep 21, 2009 1:21 pm

Biel,

Que ActiveX es ? Hay demo de él ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41858
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: As byte

Postby Antonio Linares » Mon Sep 21, 2009 1:52 pm

Biel,

Pensando en el asunto, has probado esto ?
Code: Select all  Expand view

xVar2 := xVar1
oTmp:Deserialize( xVar2 )
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41858
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: As byte

Postby Biel EA6DD » Tue Sep 22, 2009 4:14 pm

Daniel Garcia-Gil wrote:Hola Biel...

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

Code: Select all  Expand view

....
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/
User avatar
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Re: As byte

Postby Biel EA6DD » Tue Sep 22, 2009 4:16 pm

Antonio Linares wrote:Biel,

Pensando en el asunto, has probado esto ?
Code: Select all  Expand view

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/
User avatar
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Re: As byte

Postby Antonio Linares » Tue Sep 22, 2009 5: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: Select all  Expand view

      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: Select all  Expand view

   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
User avatar
Antonio Linares
Site Admin
 
Posts: 41858
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: As byte

Postby Antonio Linares » Tue Sep 22, 2009 5:33 pm

regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41858
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: As byte

Postby Antonio Linares » Wed Sep 23, 2009 12:29 am

Biel,

Este cambio en olecore.c deberia solucionar el bug:
Code: Select all  Expand view

      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
User avatar
Antonio Linares
Site Admin
 
Posts: 41858
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: As byte

Postby Biel EA6DD » Wed Sep 23, 2009 2: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/
User avatar
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Re: As byte

Postby Antonio Linares » Wed Sep 23, 2009 4: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
User avatar
Antonio Linares
Site Admin
 
Posts: 41858
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 19 guests