2012-04-10 18 views
6

Entiendo que la clase Object está en la parte superior de la jerarquía de clases en un lenguaje de programación orientado a objetos, como Java. También entiendo que tiene tipos de referencia y tipos de valores en .NET. También entiendo las definiciones de tipo en los idiomas basados ​​en C.VB6 Objeto y tipos de datos

A pesar de esto; Estoy luchando por comprender qué es un objeto en VB6 ( http://msdn.microsoft.com/en-us/library/aa338034%28v=vs.60%29.aspx ) y qué es exactamente una variante. ¿Qué es una variante? y cómo se implementa un objeto en VB6?

+0

Una variante de VB6 contiene una estructura descrita en http://msdn.microsoft.com/en-us/library/aa908601.aspx – Bob77

Respuesta

9

Todos los objetos utilizados por VB6 son objetos COM. Un objeto COM es esencialmente una estructura de datos de longitud variable cuyo encabezado de longitud variable contiene cualquier cantidad de punteros de 32 bits para las tablas V, y los bytes sucesivos contienen los datos de instancia del objeto. Por ejemplo,

Bytes 
0-3 VTable1 pointer 
4-7 VTable2 pointer 
8-11 VTable3 pointer 
... 
     Instance data 

A Vtable es una matriz de 32 bits punteros a funciones que todos se hacen pasar un puntero "this" instancia.

Bytes 
0-3 Func1(this, ..., ...) 
4-7 Func2(this, ..., ...) 
8-11 Func3(this, ..., ...) 
... 

La única otra especificación es que todos los vtables DEBE Heredar de IUnknown, es decir,las tres primeras funciones deben ser:

QueryInterface() 
AddRef() 
Release() 

Esencialmente, QueryInterface() le permite averiguar si un objeto COM soporta una interfaz específica (que está representado por un UUID). AddRef() permite que el escritor del objeto incremente un conteo de referencia interno. Release() permite al escritor del objeto disminuir el contador de referencia, destruyendo el objeto cuando el recuento es cero. Nunca llama a estos métodos en VB: el compilador agrega estas llamadas para usted (una de las ventajas de VB6).

Consulte http://msdn.microsoft.com/en-us/library/windows/desktop/ms680509(v=vs.85).aspx para obtener más información.

Un tipo 'Objeto' de VB es una referencia a un objeto que admite la interfaz IDispatch (consulte http://msdn.microsoft.com/en-us/library/windows/desktop/dd318520(v=vs.85).aspx). Esto es lo que le permite hacer el enlace tarde en VB y VBScript. Todos los objetos escritos en VB6 implementan automáticamente una interfaz que hereda de IDispatch. Esto se denomina interfaz dual, porque admite el enlace temprano y tardío.

Tenga en cuenta que no hay un sistema de tipo directo integrado en COM. Sin embargo, puede optar por admitir la interfaz ITypeInfo, que permite a los usuarios de su objeto acceder a la información que desea agregar sobre el objeto (es más fácil usar la implementación predeterminada que usa bibliotecas de tipos para almacenar esta información). El tipo Variant, mencionado por Bob Riemersma, es en realidad una estructura de 16 bytes que tiene un entero de 2 bytes (vt) que indica qué tipo de automatización se está encapsulando, y los últimos 8 bytes se pueden usar para contener tipos de valores. de hasta 8 bytes, o un puntero de 32 bits a otro tipo. VB realiza todas las conversiones necesarias entre los tipos de VB y las variantes utilizando sus funciones internas y todas las asignaciones y desasignaciones de memoria necesarias. Las variantes pueden contener referencias a objetos COM copiando el puntero al objeto en la Variante y llamando al método AddRef() del objeto.

+0

Este es un excelente resumen sobre este tema, Mark. – BobRodes

+0

La única elaboración posible que puedo ver es enfatizar que VB solo admite directamente objetos COM que exponen interfaces duales, ya que no quiere entrar en el turbio mundo de distinguir entre objetos que admiten y no soportan el enlace tardío. Por otro lado, esto no es una limitación estricta, ya que es posible mediante el uso de SendMessage y EM_GETOLEINTERFACE con una variable del tipo iUnknown para obtener una interfaz a una clase COM exclusivamente enlazada tempranamente. – BobRodes

5

Permítanme descomponerlo en cuestiones distintas:

En primer lugar, VB6 no es VB.Net y no utiliza el .Net Framework, pero en su lugar utiliza el marco COM mayores. (No puedo decir si ya sabías esto).

En segundo lugar, lo que su enlace está apuntando a son realmente las clases incorporadas a VB6. Aunque, sí, los llama "Objetos". Terminología descuidada de su parte.

En tercer lugar, y probablemente lo más importante, en VB6, todo no es un Objeto, y los Objetos ni siquiera son la categoría predeterminada o dominante de tipo de datos. Lo que es, es algo así como los tipos de valor de .Net, pero mucho menos (la mayoría ni siquiera tenía contenedores de tipo de tiempo de ejecución, solo direcciones en la memoria).

Así que la mayoría de los elementos de datos no eran objetos, no tenían clases, por lo que no tenían herencia de ningún tipo, por lo que no derivaban de otra cosa y no tenían una "jerarquía de tipos" y no podían tener tenía algo en "la parte superior" de su jerarquía de tipos (aunque las cosas que eran clases/objetos sí tenían todo esto). Por lo tanto, no tenía ningún tipo de datos de base/raíz que pudiera usar para cualquier otro tipo de datos, lo que hubiera sido un problema para todo tipo de situaciones de paso de parámetros, etc.

Las variantes eran una especie de solución anterior a este problema que en versiones anteriores de VB se implementaron (antes que los objetos en VB) para solucionar este problema. Una variante es solo un descriptor dinámico que envuelve otro elemento de con cualquier tipo de datos. Cuando lo usa, (generalmente) actúa como si estuviera usando directamente lo que contiene, pero realmente va a a través de la Variante para acceder al tipo de elemento de datos que actualmente contiene.

El Variant en sí mismo realiza un seguimiento de cuál es el tipo de datos de su contenido y hace que el código VB acceda a que se comporte de manera diferente/apropiada (un tipo primitivo de polimorfismo).

Si esto suena como su kludgy y era un montón de sobrecarga, bueno, lo era. Pero en ese momento era la mejor solución disponible cuando necesitabas manejar "cualquier tipo de datos".

+0

Me doy cuenta de que VB6 es un lenguaje basado en COM y no está basado en .NET framewwork. Mi pregunta es específicamente sobre variantes. – w0051977

+1

Estoy llegando ... :) – RBarryYoung