C/Visual C - Pasar de buffer a olevariant

 
Vista:

Pasar de buffer a olevariant

Publicado por mar646 (4 intervenciones) el 19/04/2005 18:36:39
Hola a todos. Normalmente programo en entornos delphi pero necesito hacer un activex en visual C++ y necesito ayuda. Como comento, no tengo ni idea de C++ (de C si que aprendí algo hace algún tiempo). Pues bien, tengo un buffer (byte *, que contiene la información de una imagen) y necesito hacer un método que me devuelva este buffer pero en un formato que pueda ser entendido por mi aplicación delphi. He visto que algunos componentes devuelven un OleVariant, pero no sé como pasar de byte * a Variant. ¿Cómo debo hacerlo?

De antemano muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Pasar de buffer a olevariant

Publicado por fernando.gomez (1603 intervenciones) el 19/04/2005 23:34:21
Ok, toda vez que en C no hay un tipo de dato byte, asumo que te refieres a algún typedef de char o unsigned char, o algo por el estilo:
typedef unsigned char byte;

En fin, el tipo de dato VARIANT (y sus derivados) es empleado con la finalidad de proveer diversos tipos de datos. Esto en C es logrado a través de las uniones. De hecho, VARIANT es una estructura con dos datos, el primero es un identificador del tipo de dato a emplear. El segundo, es una union con los muchos tipos diferentes de datos a emplear.

Sin embargo, esto no significa que se pueda pasar CUALQUIER valor a un VARIANT. Sólo los que estén dentro de la unión pueden ser empleados.

El VARIANT se creó con la finalidad de hacer a COM compatible con otros lenguajes, sobre todo Visual Basic. Pero no puedes pasar cualquer tipo como VARIANT.

Ahora bien, no conozco Delphi, pero en VB hay una forma de pasar el búfer de bytes. Si declaras un parámetro como Any, este recibe cualquier flujo de bytes. Entonces, supongamos que mi función en C++ para obtener los bytes de la imagen es como sigue:

char* GetImgBytes(¨);

Entonces, en VB haces la declaración normal para importar esa función desde una librería:

Declare Function GetImgBytes Lib "mylib.dll" Alias "GetImgBytes" () _
As Any

Y al invocar a esta función, tú sabes que recibirás el búfer de bytes, para su posterior manipulación en VB.

Quizás haya algo parecido en Delphi. En cualquier caso, dudo mucho que te sirva el emplear VARIANT o alguno de sus derivados. Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Pasar de buffer a olevariant

Publicado por mar646 (4 intervenciones) el 20/04/2005 09:15:51
Gracias por tu contestación. Yo no entiendo mucho de Visual C++ pero creo que si que hay un tipo de datos llamado byte. Te lo digo porque tengo el códiog en C++ del componente y lo único que quiero es pasarlo a un activex y usa el tipo byte.

Por si no me había explicado bien. Tengo una función que me devuelve como parámetro de salida un byte * (supongo que esto es un puntero a byte) y quiero pasar este 'array de bytes' a un tipo de datos que sea compatible con delphi. Delphi también contiene el tipo byte, pero en la definición de parámetros del active x no me deja poner este tipo. Total, que como he visto que otro componente active x devuelve la foto y el parámetro que recojo yo en delphi es del tipo OleVariant, pensaba que se podía hacer de alguna manera.

¿Qué forma ves tu que se puede pasar de forma más o menos sencilla?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Pasar de buffer a olevariant

Publicado por fernando.gomez (1603 intervenciones) el 20/04/2005 18:12:05
Dentro de la estructura VARIANT, dentro de la unión, hay una opción, pbByte, que actúa como un búfer de bytes. Esta variable es de tipo BYTE, que no es sino un typedef de unsigned char (nuevamente, en C/C++ no hay tipo de variable byte, consulta cualquier manual de C/C++ para convencerte; lo que tienes en tu código ha de ser algún typedef o #define, pero te doy mi palabra: no existe el tipo de dato byte, no se necesita).

Quizás para emplear VARIANT -y COleVariant por ende- deberías hacer algo como esto:

class CAlgunBitmap
{
//...
};
CAlgunBitmap objAEnviar;

unsigned char* pBuffer = new unsigned char[sizeof(CAlgunBitmap)];
memcpy(pBuffer, &objAEnviar, sizeof(CAlgunBimap));

VARIANT var;
var.vt = VT_BYREF | VT_UI1;
var.pbVal = pBuffer;

Y ya con eso podrías emplear tu VARIANT y COleVariant. Saludos.


Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Pasar de buffer a olevariant

Publicado por mar646 (4 intervenciones) el 21/04/2005 18:12:44
Gracias Fernando por tus contestaciones. Mira te informo porque a lo mejor no me he explicado demasiado bien. Tengo un ocx hecho en visual c++ que quiero usar en delphi. El ocx es el encargado de capturar una imagen y generar un evento que la devolverá. El ocx, internamente, obtiene la iamgen un buffer declarado como byte *, del cual también tengo el tamaño.
Mi pregunta es qué tipo de parámetro tengo que generar en el evento para que sea entendible posteriormente en delphi.
Yo había pensado que pasándolo como olevariant era lo ideal pero no sé como hacerlo. He probado lo que me comentaste en el post anterior y no me funciona, me llega algo pero parece estar vacío. ¿Alguna idea?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar