Parece que los objetos COM son objetos de uso general que se rigen por el sistema operativo. Los objetos siguen una interfaz estricta y le permiten consultar los objetos para determinar información. ¿Es esto lo que son los objetos COM?
COM es un mecanismo que permite la reutilización de objetos (o más bien componentes), independientemente de los lenguajes utilizados por el programador que implementó el componente y el programador que lo utiliza, e independientemente de si el componente fue implementado en el programa del cliente o en otra parte de la máquina (o red).
En términos generales, cada componente COM proporciona una implementación de una o más interfaces. Esas interfaces se definen de manera independiente del lenguaje utilizando el lenguaje de definición de interfaces (IDL) . Como ejemplo, una de las interfaces fundamentales en COM, IUnknown , se define así:
interface IUnknown
{
virtual HRESULT QueryInterface(REFIID riid, void **ppvObject) = 0;
virtual ULONG AddRef(void) = 0;
virtual ULONG Release(void) = 0;
};
Esta pequeña interfaz es fundamental en COM, porque cada componente COM debe implementarla. Define dos aspectos importantes de la maquinaria COM:
QueryInterface
permite que el código de llamada obtenga una implementación para una interfaz conocida. En COM, las interfaces son referenciadas por GUID (también conocidas como identificadores de interfaz, IID). Si un objeto implementa varias interfaces, así es como el código del cliente obtiene una referencia a cada una de esas interfaces. Actúa como una especie de operador de casting, por así decirlo.AddRef()
e Release()
implementar el mecanismo de administración de memoria para objetos COM. Como sugiere su nombre, el modelo más común es el mecanismo de recuento de referencias, donde una instancia se destruye después de que el último cliente haya publicado su referencia.Todos los componentes COM se registran en el sistema en el momento de la instalación. Si un programador desea utilizar un determinado componente, debe:
CoCreateInstance()
). Puede buscar en el registro en HKEY_CLASSES_ROOT\CLSID
: cada GUID que hay (lo más probable) es un identificador para un componente o interfaz COM, y las entradas debajo de esa clave le dicen al sistema cómo debe instanciarse.La maquinaria COM es extremadamente compleja. Por ejemplo, implementar o usar componentes COM en C requiere una enorme cantidad de trabajo, pero los lenguajes de nivel superior como Visual Basic han hecho mucho para facilitar la implementación y el uso de componentes COM. Sin embargo, los beneficios son muy reales. Hace posible escribir una aplicación en, digamos, Visual Basic, pero aún implementar los algoritmos críticos para el rendimiento en C o C ++ como objetos COM, que se pueden usar directamente desde el código VB. El sistema se encarga de ordenar los argumentos de la llamada al método, pasándolos a través de subprocesos, procesos y conexiones de red según sea necesario para que el código del cliente tenga la impresión de usar un objeto normal.
Muchas partes fundamentales de Windows se basan en COM. El Explorador de Windows (el administrador de archivos), por ejemplo, es básicamente un shell vacío. Define un montón de interfaces COM para navegar y mostrar jerarquías de árbol, y todo el código que realmente muestra "Mi PC", las unidades, las carpetas y los archivos es como un conjunto de componentes COM que implementan esas interfaces.
Con la llegada de .NET, COM se está volviendo obsoleto lentamente.
COM es un mecanismo que se desarrolló para permitir a las personas distribuir binarios que podrían reutilizarse incluso si la persona que llama estaba usando el compilador C ++ de otro proveedor o (en última instancia) un lenguaje completamente diferente.
Si desea una buena introducción a COM, lea Essential COM de Don Box .
fuente