martes, 7 de julio de 2015

Tipo de dato Variante

En algunos lenguajes de programación el tipo de dato Variante no existe, no es como si todos supieran programar en Python ¿verdad?, pero en lenguajes como Visual Basic este tipo de dato es tan comun como la estructura "if", entonces, ¿que hay detras de este tipo de dato?.

Yo recuerdo que pensaba que este tipo de dato era una simple unión (para los que no saben que es una unión, vease: Unión) de todos los datos existentes, pero es algo un poquitito mas complicado, veamos.

En el mundo real, este tipo de dato puede ser declarado como una estructura con tres miembros de tipo entero (int - integer).

  1. Tipo - El tipo de dato que contendra la variante .
  2. Reservado - Este miembro debe ser cero.
  3. Ptr - Este miembro debe contener la dirección del dato.
El primer miembro puede contener uno de los siguientes valores.

Tipo de variableBytes de datosTipo C/C++Nombre de tipo
0Limpio1
1Nulo2
102A000A80HRESULT (long int)Error
1080020004HRESULT (long int)Missing3
172ABYTE (unsigned char)Byte
11FFFFVARIANT_BOOL (short int)Booleano
22A00short intEntero
32A000000long intLargo
400002842floatReal
50000000000004540doubleDoble
6A068060000000000CY EstructuraDecimal
700000000C0D5E140DATE (double)Dato
8xxxxxxxxBSTR (wchar_t pointer)Cadena
900000000Puntero IUnknownNada4
9xxxxxxxxPuntero IUnknownReferencia a objeto5

Muy simple, probemor escribir el código.

Estruc Variante,_
            Tipo:Entero,_
            Reservado:Entero,_
            Ptr:Entero

Supongamos lo siguiene, en Visual Basic por X motivo necesitamos utilizar un procedimiento de una DLL externa que NOSOTROS programamos, y por X motivo el primer parametro debe ser si o si variante, ¿como choclo hago?.

Pues muy facil, veamos el código de Visual Basic.

Private declare function Mensaje lib "MiDLL.dll" (Parametro1 as Variant)

Sub Form_Load()
       Mensaje "Hola Mundo!" ' Llamamos al procedimiento de nuestra DLL.
End Sub

Entonces el código de la DLL seria el siguiente.

Importar "Cadena.prp"
' API
Proc MessageBox(hWnd:Entero,Referencia Texto,Título:Cadena,Bandera:Entero):Entero,"User32" "MessageBoxA"


Estruc Variante,_
            Tipo:Entero,_
            Reservado:Entero,_
            Ptr:Entero

Proc Mensaje(Parametro1:Variante) Exportar
       Seleccionar Parametro1.Tipo ' Seleccionamos el tipo devuelto por la llamada de VB.
           Caso 8 ' Si el tipo del dato variante es una cadena (vease la tabla anterior).
               MessageBox(0,CadDePtr(Parametro1.Ptr),"Título!",48) ' Mostrar el contenido obtenido de Ptr miembro.
           Caso Otro
               Salir
       FinSeleccionar
FinProc

Saludos!