Objetos de clase COM y CLSID
Un servidor COM se implementa como una clase COM. Una clase COM es una implementación de un grupo de interfaces en el código ejecutado cada vez que interactúa con un objeto determinado. Hay una distinción importante entre una clase de C++ y una clase COM: en C++, una clase es un tipo, mientras que una clase COM es simplemente una definición del objeto y no incluye ningún tipo, aunque un programador de C++ podría implementarlo mediante una clase de C++. COM está diseñado para permitir que diferentes aplicaciones usen una clase, incluidas las aplicaciones escritas sin conocimiento de la existencia de esa clase en particular. Por lo tanto, el código de clase de un tipo determinado de objeto existe en una biblioteca vinculada dinámica (DLL) o en otra aplicación ejecutable (EXE).
Cada clase COM se identifica mediante un CLSID, un GUID único de 128 bits, que el servidor debe registrar. COM usa este CLSID, a petición de un cliente, para asociar datos específicos al archivo DLL o EXE que contiene el código que implementa la clase , creando así una instancia del objeto .
En el caso de los clientes y servidores en el mismo equipo, el CLSID del servidor es todo lo que necesita el cliente. En cada equipo, COM mantiene una base de datos (hace uso del registro del sistema en plataformas Microsoft Windows y Macintosh) de todos los CLSID para los servidores instalados en el sistema. Se trata de una asignación entre cada CLSID y la ubicación del archivo DLL o EXE que aloja el código de ese CLSID. COM consulta esta base de datos cada vez que un cliente desea crear una instancia de una clase COM y usar sus servicios, por lo que el cliente nunca necesita conocer la ubicación absoluta del código en el equipo.
En el caso de los sistemas distribuidos, COM proporciona entradas del Registro que permiten a un servidor remoto registrarse para su uso por parte de un cliente. Aunque las aplicaciones solo necesitan conocer el CLSID de un servidor, ya que pueden confiar en el registro para localizar el servidor, COM permite a los clientes invalidar las entradas del Registro y especificar ubicaciones de servidor para aprovechar al máximo la red. (Vea Buscar un objeto remoto).
La manera básica de crear una instancia de una clase es a través de un objeto de clase COM. Esto es simplemente un objeto intermedio que admite funciones comunes a la creación de nuevas instancias de una clase determinada. La mayoría de los objetos de clase usados para crear objetos a partir de un CLSID admiten la interfaz IClassFactory , una interfaz que incluye el importante método CreateInstance . Se implementa una interfaz IClassFactory para cada clase de objeto que se ofrece para crear instancias. (Para obtener más información sobre la implementación de IClassFactory, consulte Implementación de IClassFactory).
Nota
Los servidores que admiten alguna otra interfaz de generador de clases personalizadas no son necesarios para admitir IClassFactory específicamente. Sin embargo, las llamadas a funciones de activación distintas de CoGetClassObject (como CoCreateInstanceEx) requieren que el servidor admita IClassFactory.
Cuando un cliente quiere crear una instancia del objeto del servidor, usa el CLSID del objeto deseado en una llamada a CoGetClassObject. (Esta llamada puede ser directa o implícita, a través de una de las funciones auxiliares de creación de objetos). Esta función busca el código asociado al CLSID y crea un objeto de clase y proporciona un puntero a la interfaz solicitada. (CoGetClassObject toma un parámetro riid que especifica el puntero de interfaz deseado del cliente).
Nota
COM tiene solo algunas funciones en las que se crean muchas de las otras. La más importante de estas es probablemente CoGetClassObject, que subyace a todas las funciones de creación de instancias.
Con este puntero, el autor de la llamada puede crear una instancia del objeto y recuperar un puntero a una interfaz solicitada en el objeto . Normalmente se trata de una interfaz de inicialización, que se usa para activar el objeto (colocarlo en el estado en ejecución) para que el cliente pueda hacer cualquier trabajo con el objeto que desee. Con las funciones básicas de COM, el cliente también debe tener cuidado de liberar todos los punteros de objeto.
Otro mecanismo para activar instancias de objeto es a través del moniker de clase. Los monikers de clase enlazan al objeto de clase de la clase para la que se crean. Para obtener más información, vea Clase Monikers.
COM proporciona varias funciones auxiliares que reducen el trabajo de creación de instancias de objeto. Se describen en Funciones auxiliares de creación de instancias.
Temas relacionados