htm=articulo/combase.htm ok articulo/combase.htm COM básico.

COM básico.

Descripción de algunos de los conceptos fundamentales de COM.


¿ Que es COM ?

COM es un acrónimo de Componen Object Model, el modelo de componentes software definido por Microsoft, que constituye una parte fundamental de Windows y de varias tecnologías implementadas en esta plataforma.


¿ Qué es un componente COM ?

Un objeto o componente COM es una pieza de software que cumple ciertas reglas. El objeto se define a nivel binario de modo que cualquier lenguaje de programacion pueda servir para crear objetos COM .

Los objetos COM implementan interfaces. Todo objeto debe implementar al menos el interface IUnknown.


¿ Como se crea un objeto ?

Algunos objetos COM se registran en el sistema y pueden ser creados usando una funcion como CreateObject. Otros objetos se pueden obtener indirectamente, a traves de los métodos de otros objetos.


¿Como se destruye un objeto ?

Hay que usar los métodos de IUnknow para llevar la cuenta del número de referencias activas, cuando el número de referencias activas es nulo, el objeto se autodestruye.


¿ Que son las 'referencias' ?

Los objetos COM se manejan por medio de 'referencias' a alguno de sus interfaces. Una referencia es un puntero, es decir una variable que contiene una direccion de memoria.


¿ Qué es un interface ?

Un interface es un conjunto de métodos (funciones) agrupados con un propósito común. Por ejemplo, el interface IUnknown consta de tres métodos que permiten explorar los interfaces implementados por el objeto y llevar la cuenta del numero de referencias activas que direccionan al objeto.


¿ Que es la VTBL ?

La VTBL, tabla de métodos virtuales, es una estructura que contiene punteros a las funciones de un interface.

Cada interface de un objeto consta de una serie de funciones y una VTBL, esta VTBL contiene una lista de punteros que apuntan a las funciones del interface.

Para acceder a todas las funciones de un interface basta disponer de un puntero a su VTBL. Por eso, cuando disponemos de un puntero a la VTBL decimos que tenemos un puntero que apunta al interface.


¿No consumen mucha memoria tantas VTLB ?

En realidad no, para cada tipo de objeto (cada clase) y para cada interface existe una sola VTLB.

Cada objeto instanciado guarda solo un puntero a la VTBL (la VTBL misma, es compartida por todos los objetos de la misma clase).

Cuando obtenemos un puntero a una interface, lo que obtenemos en realidad es un puntero que apunta al puntero contenido en el objeto y este a su vez apunta a la VTBL (donde estan los punteros que apuntan a los métodos del interface).

A efectos prácticos, podemos decir que tenemos un puntero o referencia que apunta al interface, no es necesario recordar que se trata de una doble indireccion ya que el compilador se encarga de desreferenciar el puntero para acceder a los métodos del interface.


¿Como se obtiene un puntero a un interface ?

Al crear un objeto se obtiene un puntero a un interface del objeto. Todos los interfaces derivan de IUnknow, es decir que los tres primeros métodos de todos los interfaces son los métodos de IUnknow.

Dos métodos de IUnknow -AddRef y Release- permiten llevar la cuenta del número de referencias (punteros) activas. El tercero -QueryInterface- permite obtener referencias a cualquiera de los interfaces del objeto.


¿ Que es un GUID ?

Un GUID (identificador global único) es un número que es único e identifica a un objeto, interface, ...

La caracteristica fundamental de un GUID es su 'unicidad', una vez generado un GUID podemos presuponer que nunca nadie va a generar un GUID idéntico.

Este tipo de números únicos se usan para identificar objetos (CLSID), interfaces (IID), librerías de tipos (LIBID), ... Esto es más seguro que identificar estos elementos por un nombre.

Para obtener un objeto, pedimos al sistema operativo que cree una instancia del objeto con un determinado CLSID. Para obtener un interface llamamos al método QueryInterface con el IID del interface que deseamos, etc...


¿Que es una librería de tipos ?

Una librería de tipos es un fichero binario que describe objetos, interfaces, métodos, tipos de datos, etc...

Las librería de tipos pueden estar contenidas en DLLs (como recursos) o pueden ser independientes (ficheros *.tlb)

A partir de una librería de tipos, cualquier lenguaje puede usar los objetos, métodos, etc... que esta librería describe. Se evita así tener que crear ficheros con declaraciones para cada lenguaje específico.

Las librería de tipos se crean escribiendo un fichero de texto (*.odl o *.idl) y compilando con MIDL.EXE .

En cualquier caso, hay que tener claro que las librerías de tipo solo 'declaran', no 'implementan'. (tambien los ficheros fuente odl/idl contienen solo declaraciones)



© info3@maicas.net