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).
- Tipo - El tipo de dato que contendra la variante .
- Reservado - Este miembro debe ser cero.
- Ptr - Este miembro debe contener la dirección del dato.
El primer miembro puede contener uno de los siguientes valores.
Tipo de variable | Bytes de datos | Tipo C/C++ | Nombre de tipo |
---|---|---|---|
0 | Limpio1 | ||
1 | Nulo2 | ||
10 | 2A000A80 | HRESULT (long int) | Error |
10 | 80020004 | HRESULT (long int) | Missing3 |
17 | 2A | BYTE (unsigned char) | Byte |
11 | FFFF | VARIANT_BOOL (short int) | Booleano |
2 | 2A00 | short int | Entero |
3 | 2A000000 | long int | Largo |
4 | 00002842 | float | Real |
5 | 0000000000004540 | double | Doble |
6 | A068060000000000 | CY Estructura | Decimal |
7 | 00000000C0D5E140 | DATE (double) | Dato |
8 | xxxxxxxx | BSTR (wchar_t pointer) | Cadena |
9 | 00000000 | Puntero IUnknown | Nada4 |
9 | xxxxxxxx | Puntero IUnknown | Referencia 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!
No hay comentarios:
Publicar un comentario