Component Object Model
Component Object Model
Esta plataforma es utilizada para permitir la comunicacin entre procesos y la creacin dinmica de objetos, en cualquier lenguaje de programacin que soporte dicha tecnologa. El trmino COM es a menudo usado en el mundo del desarrollo de software como un trmino que abarca las tecnologas OLE, OLE Automation, ActiveX, COM+ y DCOM. Si bien COM fue introducido en 1993, Microsoft no hizo nfasis en el nombreCOM hasta 1997. Esencialmente COM es una manera de implementar objetos neutrales con respecto al lenguaje, de manera que pueden ser usados en entornos distintos de aquel en que fueron creados, a travs de fronteras entre mquinas. Para componentes bien creados, COM permite la reutilizacin de objetos sin conocimiento de su implementacin interna, porque fuerza a los implementadores de componentes a proveer interfaces bien definidas que estn separados de la implementacin. Las diferentes semnticas de reserva de memoria estn acomodadas haciendo a los objetos responsables de su propia creacin y destruccin por medio del contador de referencias. Se puede hacer casting entre distintas interfaces de un objeto por medio de la funcin QueryInterface(). El mtodo preferido de herencia en COM es la creacin de subobjetos a los que se delegan las llamadas a mtodos ( llamado agregacin ). Aunque estas tecnologas han sido implementadas en muchas plataformas, son principalmente usadas con Microsoft Windows. Se espera que COM sea sustituido, al menos en un cierto grado, por Microsoft.NET, y soporte para Web Services a travs de Windows Communication Foundation (WCF). DCOM en red usa formatos binarios propietarios, mientras que WCF usa mensajesSOAP basados en XML. COM tambin compite con CORBA y Java Beans como sistema de componentes de software.
Detalles tcnicos
Los programadores COM construyen software usando componentes de software COM-aware. Diferentes tipos de componentes son identificados por tipo de IDs (CLSIDs), los cuales son identificadores globales nicos, o GUIDs. Cada componente COM revela su funcionalidad por medio de una o ms interfaces. Las diferentes interfaces soportadas por un componente son distinguidas las unas de las otros usando interfaces IDs (IIDs), que son tambin GUIDs. Las Interfaces COM tienen implementaciones en varios lenguajes, tales como C, C++, Visual Basic, y varios de los lenguajes de script implementados en la plataforma Windows. Todo acceso a los componentes se realiza a travs de los mtodos de las interfaces. Esto permite que tcnicas como inter-proceso, incluso programacin entre ordenadores (este ltimo mediante el apoyo de DCOM).
Interfaces
Todos los componentes COM deben implementar, al menos, la interfaz estndar IUnknown, y as todas las interfaces COM son derivadas de IUnknown. La interfaz IUnkown consta de tres mtodos: AddRef() y Release(), que implementan conteo de referencias y control del ciclo de vida de las interfaces; y QueryInterface(), que por especificar un IID permite a una llamada recuperar las referencias a las diferentes interfaces que el componente implementa. El efecto de QueryInterface() es similar a dynamic_cast <> en C + + o casting en C # y Java.
Las interfaces de un componente COM es necesario que muestren las propiedades reflexiva, simtrica y transitiva. La propiedad reflexiva se refiere a la capacidad para que la llamada al QueryInterface(), dada una interfaz con el ID de la interfaz, devuelva la misma instancia de la interfaz. La propiedad simtrica hace referencia a que cuando la interfaz B es recuperada de la interfaz A por el QueryInterface(), la interfaz A es asimismo recuperable de la B. La propiedad transitiva es similar a la simtrica, pero requiere que si la interfaz B puede conseguirse de la A, y la C a su vez de la B, entonces la interfaz C debera poder conseguirse de la A. Una interfaz consta de un puntero a una funcin virtual que contiene una lista de punteros a las funciones que implementa la funcin declarada en la interfaz, en el mismo orden que fueron declaradas en la interfaz. Esta tcnica de paso de punteros de funcin de estructuras es muy parecida a la utilizada por OLE 1.0 para comunicar con su sistema de libreras. COM especifica muchas otras interfaces estndar usadas para permitir comunicacin entre componentes. Por ejemplo, una de ellas es IStream, que est puesta para los componentes que tienen semntica de flujo de datos (un componente FileStream usado para leer y escribir archivos). Tiene los esperados mtodos Read y Write para realizar las lecturas y escrituras de flujo. Otra interfaz estndar es IOleObject, que esta puesta para componentes que esperan ser enlazados o empotrados en un contenedor. IOleObject contiene mtodos que permiten a los interesados determinar el tamao de los lmites de un componente rectngulo, si el componente soporta operaciones como Open, Save y as sucesivamente.
Clases
Una clase en COM se denomina coclass, que es la forma contrada de Component Object class. Una coclass es la forma de COM de definir una clase en el sentido orientado a objetos independiente del lenguaje. Una coclass suministra una implementacin concreta de una o ms interfaces. En COM, tales implementaciones concretas pueden ser escritas en cualquier lenguaje de programacin que soporte desarrollo de componentes COM, como C++, Visual Basic, etc. Una de las mayores contribuciones de COM al mundo de desarrollo Windows es la toma de conciencia del concepto de separacin de interfaz de implementacin. Esta toma de conciencia ha influido, sin duda, en el camino programadores al construir los sistemas de hoy. Una extensin de este concepto fundamental es el concepto de una interfaz, mltiples implementaciones. Esto significa que en tiempo de ejecucin, una aplicacin puede elegir la instanciacin de una interfaz de una de las diferentes implementaciones concretas.
adicional, como el GUID de las interfaces y la relacin entre los parmetros de puntero y longitud de los campos. El archivo IDL es compilado por el compilador MIDL en un par de formas para utilizarlos en varios lenguajes. Para C/C++, el compilador MIDL genera una cabecera independiente del compilador que contiene definiciones de estructuras que emparejan las funciones virtuales de la declaracin de interfaces y un archivo C que contiene declaraciones de la interfaz GUIDs. El cdigo fuente C++ para un modulo Proxy puede tambin ser generado por el compilador MIDL. Este Proxy contiene mtodos stubs para convertir llamadas COM en RPC, esto permitido por el DCOM. Un archivo IDL puede tambin ser compilado por el compilador MIDL en una librera de tipos (archivo .TLB). Los metadatos binarios contenidos dentro de la librera tiene significado para ser procesados por los compiladores del lenguaje y entornos de tiempo de ejecucin (VB, Delphi, el .NET CLR, etc.). El resultado final de tal procesado TLB es que la construccin especfica de cada lenguaje estn producidas a lo que representa la clase COM definida en la .TLB (y en defnitiva el que se defini en el archivo de origen IDL).
Conteo de referencias
La ms importante de todas las interfaz COM, es decir, IUnknown (de la que todas las interfaces COM debe ser derivadas), admite dos conceptos principales: la exploracin caractersticas a travs del mtodo QueryInterface, y la gestin del ciclo de vida del objeto mediante la inclusin de AddRef () y Release (). Conteo de referencias y exploracin de caracterstica que se aplican a los objetos (no a cada interfaz de un objeto) y, por tanto, debe tener una implementacin centralizada. Las especificaciones COM requieren de una tcnica llamada conteo de referencias para garantizar que los distintos objetos estn vivos mientras haya clientes que han adquirido el acceso a uno o ms de sus interfaces y, por el contrario, que el mismo objeto est correctamente eliminados cuando todo cdigo que usa el objeto haya terminado con l y ya no lo requiere. Un objeto COM es el responsable de la liberacin de su propia memoria una vez que su contador de referencias se reduce a cero. Para su ejecucin, un objeto COM generalmente mantiene un valor que se utiliza de referencia para el conteo. Cuando es llamado AddRef () a travs de cualquiera de las interfaces del objeto, este valor se incrementa. Cuando se llama a Release(), este nmero entero se decrementa. AddRef () y Release () son los nicos medios por los que un cliente de un objeto COM es capaz de influir en su ciclo de vida. El valor interno sigue siendo un miembro privado del objeto COM y nunca ser accesible directamente.
Instanciacin
COM normaliza el proceso de instanciacin (es decir, la creacin) de objetos COM, al exigir la utilizacin de la clase Factories. Para cada objeto COM que se cre, dos parmetros asociados deben existir: Una clase ID. Una clase Factory.
Cada clase o CoClass COM debe estar asociada con una nica ID de clase (un GUID). Tambin debe ser asociada con su propia clase Factory (que se logra mediante el uso de un registro
centralizado). Una clase Factory es en s misma un objeto COM. Es un objeto que debe exponer la IClassFactory o IClassFactory2 (este ltimo con la soporte licencias de apoyo) interfaz. La responsabilidad de dicho objeto es la creacin de otros objetos. Una clase Factory suele estar contenida en el mismo cdigo ejecutable (es decir, el servidor de cdigo) como el propio objeto COM. Cuando una clase Factory est llamada a crear un objeto objetivo, este objetivo del objeto es el id de clase que debe ser proporcionado. As es como la clase Factory sabe qu clase de objeto instancia. Una sola clase Factory objeto puede crear objetos de ms de una clase. Es decir, dos objetos de diferente ids de clase pueden ser creados por la misma clase de Factory objeto. Sin embargo, esto es transparente para el sistema de COM. Delegando la responsabilidad de creacin de un objeto en objeto separado, se consigue un mayor nivel de abstraccin y el desarrollador tiene una mayor flexibilidad. A fin de que las aplicaciones cliente puedan adquirir las clases de objetos Factory, los servidores COM debe exponerlos adecuadamente. Una clase Factory est expuesta de forma diferente, en funcin de la naturaleza del cdigo del servidor. Un servidor que est basado en DLL debe exportar una funcin global DllGetClassObject (). Un servidor EXE que est basado en los registros de clases Factory en tiempo de ejecucin a travs de la funcin de la API de Windows de CoRegisterClassObject ().
Programacin
COM es un estndar binario y puede ser desarrollado en cualquier lenguaje de programacin capaz de comprender e implementar sus tipos de datos binarios definidos e interfaces. Bibliotecas en tiempo de ejecucin (en situaciones extremas, los programadores) son las responsables de que entren y salgan del entorno COM, instanciacin y conteo de referencias de objetos COM, objetos para consultar informacin sobre la versin, la codificacin de aprovechar las avanzadas versiones de objetos.
Crticas
Mensaje de bombeo
Cuando un STA se inicializa que crea una ventana oculta que se utiliza para la inter-apartamento y entre procesos de enrutamiento de mensajes. Esta ventana debe tener su cola de mensajes regularmente bombeado. Esta construccin se conoce como un mensaje bomba. En versiones anteriores de Windows no hacerlo podra causar en todo el sistema bloqueos. Este problema es especialmente desagradable porque algunas APIs de Windows inicializa COM como parte de su aplicacin, lo que provoca una fuga de los detalles de implementacin.
Conteo de referencias
El conteo de referencias dentro de COM puede causar problemas si dos o ms objetos estn referenciados circularmente. El diseo de una aplicacin debe tener esto en cuenta para que los objetos no se queden hurfanos. Los objetos pueden tambin dejar activa la cuenta referencias si el COM "caso sumidero" es el modelo utilizado. Dado que el objeto que dispara el evento necesita una referencia al objeto para reaccionar al evento, el conteo de referencias a objeto nunca llega a cero.
DLL hell
Debido a la ubicacin de cada uno de los componentes se almacenan en una ubicacin de todo el sistema (el registro de Windows), puede haber una sola versin de un cierto componente instalado. Por lo tanto, COM sufre seriamente del DLL hell, en que dos o ms aplicaciones requieren diferentes versiones de un mismo componente. Windows XP introduce un nuevo modo de registro de objetos COM "Registro libre de COM". Este servicio hace posible que las aplicaciones que necesiten para instalar los objetos COM almacenaran toda la informacin de registro necesaria para COM registro en la solicitud del directorio, en lugar de en el registro global, en donde, en rigor slo una nica solicitud se utilizan. DLL hell, se pueden evitar mediante Registro-COM libre, la nica limitacin que se requiere, al menos, Windows XP o posteriores versiones de Windows y que no debe utilizarse para EXE, COM o servidores en todo el sistema de componentes, tales como MDAC, MSXML, DirectX o Internet Explorer.