Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 siempre que interactúe 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 contiene 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 a la DLL o EXE que contiene el código que implementa la clase, creando así una instancia del objeto.
Para clientes y servidores en el mismo equipo, 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 siempre 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 que un servidor remoto se registre 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 del 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 interfazIClassFactory, una interfaz que incluye el métodoCreateInstance importante. Implemente una interfaz IClassFactory para cada clase de objeto que ofrezca para crear instancias. (Para obtener más información sobre cómo implementar IClassFactory, vea 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 unas pocas funciones sobre las que se compilan muchos de los demás. Lo más importante de esto 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 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 para 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 se 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. Estos se describen en las funciones auxiliares de creación de instancias de .
Temas relacionados