Escolar Documentos
Profissional Documentos
Cultura Documentos
COM/DCOM
en C++
COM/DCOM
4 Ingeniero de Telecomunicacin
ndice de
Contenidos
COM/DCOM...............................................................................................1
NDICE DE CONTENIDOS......................................................................2
INTRODUCCIN.......................................................................................4
UN POCO DE HISTORIA................................................................................4
POR QU Y PARA QU COM?..................................................................5
MODELO CLIENTE/SERVIDOR............................................................6
IDENTIFICACIN DEL SERVIDOR.................................................................6
MODELO COM...........................................................................................7
DIFERENCIAS ENTRE C++ Y COM.............................................................8
INTERFACES................................................................................................9
Interfaz IUnknown................................................................................10
TIPOS DE SERVIDORES COM....................................................................12
Servidores COM en DLL......................................................................12
Servidores COM en EXE......................................................................12
Servidores COM remotos o DCOM.....................................................12
CLIENTES COM EN LA PRCTICA...................................................14
EJEMPLO DE CLIENTE COM.....................................................................15
EJEMPLO DE SERVIDOR COM..................................................................18
PROBNDOLO EN DISTINTAS MQUINAS..................................................24
LTIMAS PALABRAS............................................................................25
BIBLIOGRAFA.......................................................................................26
2
COM/DCOM
COM/DCOM
Introduccin
Un poco de historia
Cuando Microsoft estaba desarrollando sus primeros sistemas
operativos Windows se encontr con un problema. Necesitaban poder
insertar grficos de una de sus aplicaciones ( Microsoft Graph ) en otra de
4
COM/DCOM
ellas ( Microsoft PowerPoint ). En 1991 disearon un protocolo mediante el
cual en un documento podran insertarse objetos mantenidos por programas
distintos en los que se estaba editando. El protocolo se llamaba OLE 1.0 y
se basaba en el paso de mensajes y el uso de memoria global compartida.
El resultado fue realmente malo, no slo por la fragilidad del sistema ( con
la cada de una de las aplicaciones caa el sistema ), adems de que era muy
complicada la realizacin de componentes para los programadores.
La siguiente versin de OLE ( llamada COM ) se rescribi desde
cero por Microsoft y DEC en un principio. Al final DEC abandon el
proyecto y Microsoft continu con l.
Las nuevas versiones que realiz Microsoft ampliaron el modelo
para poder usar los componentes desde distintos ordenadores ( DCOM o
Distributed COM ).
COM/DCOM
Modelo
Cliente/Servidor
El uso de los componentes COM es un claro ejemplo de la
arquitectura Cliente/Servidor. El objeto COM en s es el servidor, y es
usado por un programa que hace de cliente. Existen varias formas de
realizar la comunicacin. Podemos encontrar los componentes como partes
de un ejecutable ( como el caso de los productos de Microsoft Office, o si
implementamos nuestro propio componente y lo incluimos con un
programa que los use ), dentro de una librera de enlace dinmico ( DLL ) o
incluso en otra mquina ( DCOM ).
COM/DCOM
objetos COM ( como por ejemplo para identificar dispositivos, drivers,
conexiones, componentes... ). Los GUIDs utilizados para identificar objetos
COM, se les denominan CLSID ( Identificador de clase ).
A la hora de programar y de asignar un CLSID a un objeto COM,
Microsoft nos proporciona un algoritmo que garantiza la exclusividad en el
espacio y en el tiempo, ( No se van a repetir 2 GUIDs iguales ).
Por lo tanto, tras la creacin de un componente COM, se le asigna un
CLSID que lo identificar para que pueda ser usado por los clientes.
Modelo COM
En el modelo clsico de programacin orientada a objetos se suele
identificar al objeto con su interfaz. De hecho, est tan unida la interfaz al
objeto que se puede decir que tal objeto es el que tiene tales funciones. Sin
embargo, el modelo COM realiza la distincin entre el objeto y las
interfaces que implementan. As, para COM una interfaz es un conjunto de
declaraciones de funciones que puede o no implementar un objeto. La
definicin de Interfaz es : conjunto de funciones que se ponen a disposicin
del pblico. Suelen tener relacin entre s. Las interfaces tambin tiene un
GUID ( denominado IID, o identificador de interfaz ). Un mismo objeto
puede implementar ( y de hecho lo hace siempre ) varias interfaces.
Por ejemplo: si hicisemos un objeto para modelar a un hombre, nos
podra interesar su faceta ( aqu usar faceta como sinnimo de interfaz ) de
trabajador, como persona, como ser vivo, como estudiante, ... En cada
faceta nos puede interesar una serie de funciones y propiedades. Esto en C+
+ corresponde a una clase abstracta ( ninguna de las funciones estn
definidas ). Por eso, cada objeto puede implementar libremente estas
funciones.
Veamos ms en profundidad el ejemplo sobre las facetas: As, como
trabajador un hombre puede cobrar, trabajar, faltar al trabajo ( los
mtodos de la interfaz trabajador del objeto hombre ) , y tener un sueldo,
un jefe, un puesto, un horario ( las propiedades de la interfaz trabajador ).
Sin embargo, un hombre hace algo ms que trabajar. Como persona puede
divertirse, salir a pasear, y tiene amigos, padres, cnyuge... Y as con las
dems interfaces.
En determinados contextos nos interesarn unas caractersticas ( los
mtodos y propiedades ) y otras veces no. De hecho no todo ser vivo, es un
hombre. Por lo tanto, las acciones comunes a todos los seres vivos no
deberan estar declaradas para el hombre, y tambin para las plantas, y para
los animales. Bastara con saber qu es un ser vivo ( que mtodos y
propiedades tiene ) y decir que el hombre es un ser vivo ( es decir, que
implementa esa interfaz ) .
COM/DCOM
OBJETO HOMBRE
INTERFAZ
TRABAJADO
R
Cobrar
Trabajar
Faltar
Sueldo, jefe,
horario, puesto
INTERFAZ
HOMBRE
Divertir
Salir
a
pasear
Amigos,
padres...
Funciones y Propiedades
IID_IHombre
IID_ITrabajador
INTERFAZ
SER VIVO
Respirar
Vivir
Edad
IID_ISerVivo
COM/DCOM
construccin del objeto. En el segundo caso, la comunicacin se realiza de
forma transparente al usuario, gestionado por el sistema operativo.
Interfaces
Son parte fundamental del modelo. Este concepto no existe en C++.
Las interfaces en C++ se implementan como clases. Derivan todas ellas de
la interfaz IUnknown. La particularidad de las interfaces es que son clases
abstractas, es decir, no definen ninguna de las funciones que declaran. Por
lo tanto, una interfaz es una clase que contiene un determinado nmero de
punteros a funciones ( todas ellas en la tabla de mtodos virtuales VMT ).
Es el propio objeto COM el que tiene que implementar las funciones.
El usuario ( cliente ) nunca va a poder tratar con el objeto
directamente. Tendr que hacerlo a travs de sus interfaces. Por lo tanto, el
usuario tendr un puntero a esa interfaz y podr llamar a los mtodos que
declara la propia interfaz ( y estarn definidas por el objeto COM que
implemente dicha interfaz ).
Cuando el usuario crea un objeto, obtiene un puntero a la interfaz
IUnknown. Esta interfaz deber proporcionar las funciones necesarias para
poder usar otra interfaz. Cada objeto COM, deber implementar una serie
de funciones mnimas que garantice la funcionalidad del mismo.
COM/DCOM
Interfaz IUnknown
Como antes hemos visto, toda interfaz deriva de IUnknown. Veamos
un poco ms en profundidad esta clase.
Si nos fijamos en este grfico, hay una interfaz que aparece arriba.
Esa sera por la que entraramos al Objeto COM, la que hemos llamado
IUnknown.
La declaracin de esta interfaz en lenguaje IDL ( Interface
Description Language ) es:
[ local, object
huid(00000000-0000-0000-C000-000000000046)
pointer_default(unique)
]
interface IUnknown
{
HRESULT QueryInterface (
[in] REFIID riid,
[out, iid_is(riid)] void **ppvObject);
ULONG AddRef();
ULONG Release();
}
Como COM debe ser independiente del lenguaje, debe existir al
menos un lenguaje neutro para definir las estructuras, las funciones y los
propios objetos. Microsoft utiliza una variante del IDL empleado por RPC (
Remote Procedure Call ), eso s, orientado a objetos. A partir de este
lenguaje sera posible obtener las declaraciones en distintos lenguajes de
programacin para que pudieran ser usados.
Si nos fijamos en la declaracin de esta interfaz, vemos 3 mtodos:
QueryInterface(), AddRef() y Release(). El primero de ellos se usa para la
10
COM/DCOM
introspeccin. Un objeto COM es una caja negra ( ms negra que de
costumbre ). En principio, al crear un objeto, slo tendremos acceso a su
interfaz IUnknown. El que todos los objetos implementen esta interfaz, no
significa que sean iguales. En general, IUnknown funcionar de un modo u
otro segn el objeto que hayamos creado. QueryInterface sirve para pedir
un puntero a otra interfaz del mismo objeto. Siempre funciona de la misma
manera: se le pasan dos parmetros, el primero es el IID ( recordemos que
era el identificador de interfaz ) de la interfaz que queremos obtener, y de
segundo parmetro un puntero a puntero a esa interfaz. Por ejemplo:
CoCreateInstante
(
CLSID_Objeto1,
NULL,
CLSCTX_ALL,
IID_IUnknown, (void **) &Interfaz1);
Interfaz1->QueryInterface ( IID_Interfaz2, ( void ** ) &Interfaz2 );
Con Interfaz1 un puntero a la interfaz IUnknown y Interfaz2 un
puntero a cualquier otra interfaz del objeto creado. Despus de ejecutar
estas lneas, tendremos en Interfaz2 un puntero a la interfaz IID_Interfaz2
del Objeto1, y podremos usar las funciones correspondientes de esta
interfaz.
En este pequeo ejemplo se ve que los objetos COM estn diseados
para otros lenguajes aparte del C++. Al segundo parmetro de
QueryInterface hay que hacerle un cast bastante forzado ( void ** ), cuyo
uso en C++ est muy desaconsejado.
A continuacin, un grfico nos muestra otra forma de ver los objetos
COM. El objeto COM es la caja, y cada una de las interfaces son los
paneles. Cada Panel tiene adems un conjunto de botones que son las
funciones.
11
COM/DCOM
Pero adems, como todas las interfaces derivan de IUnknown, todas
deben implementar las 3 funciones QueryInterface, AddRef y Release. As,
desde cada interfaz, podemos obtener un puntero a cualquiera de las otras
interfaces.
Con respecto a las otras dos funciones, sirven para controlar el
tiempo de vida de cada objeto COM. Esto se usa para liberar al objeto
COM de la memoria.
COM/DCOM
servidor ). Pero, si los objetos se usan igual, cmo se puede conseguir
entonces el efecto de llamadas a funcin?. Es decir, como podra usarse?
Objeto1->Funcion1 ( parametros );
El cliente no tiene constancia entonces de que tiene establecer una
conexin por red. Es el sistema operativo el que tiene que poner un proxy
que simule que las funciones estn accesibles. Y la llamada a la
Funcion1 realmente estar llamando a una funcin local gestionada por el
sistema operativo que realice la comunicacin con el otro extremo.
13
COM/DCOM
Clientes COM en
la prctica
Empieza a ser hora ya de ver algo de cdigo. Lo primero que
veremos es la obtencin de un objeto COM. Para ello, usaremos una
llamada al API de Windows, CoCreateInstante. Su declaracin es la
siguiente:
STDAPI CoGetClassObject(
REFCLSID rclsid, //CLSID asociado al objeto
DWORD dwClsContext,
//Contexto del cliente
COSERVERINFO * pServerInfo,
//Puntero a una maquina en la que el objeto va
a //ser instanciado
REFIID riid,
//Referencia al identificador de la interfaz
//
LPVOID * ppv
//Direccin del puntero que recibe la interfaz
);
14
COM/DCOM
15
COM/DCOM
16
COM/DCOM
Dndole a Create Unit genera 2 ficheros ( uno .cpp y otro .h ) con los
datos necesarios para el programa.
SDCOM1Lib_TBL.cpp
// C++ TLBWRTR : $Revision: 1.134.1.41 $
// File generated on 26/03/2001 2:50:46 from Type Library described
below.
// ********************************************************* //
// Type Lib: C:\PROYECTO\COM\SDCOM1\DEBUG\SDCOM1.DLL (1)
// IID\LCID: {FC4C8D19-90EC-4298-8668-FD912413DA6D}\0
// Helpfile:
// DepndLst:
// (1) v2.0 stdole, (C:\WINDOWS\SYSTEM\StdOle2.Tlb)
// (2) v4.0 StdVCL, (C:\WINDOWS\SYSTEM\STDVCL40.DLL)
// ********************************************************* //
#include <vcl.h>
#pragma hdrstop
#include "SDCOM1Lib_TLB.h"
#if !defined(__PRAGMA_PACKAGE_SMART_INIT)
#define __PRAGMA_PACKAGE_SMART_INIT
17
COM/DCOM
#pragma package(smart_init)
#endif
namespace Sdcom1lib_tlb
{
// *********************************************************//
// GUIDS declared in the TypeLibrary
// *********************************************************//
const GUID LIBID_SDCOM1Lib = {0xFC4C8D19, 0x90EC, 0x4298,
{ 0x86, 0x68, 0xFD, 0x91, 0x24, 0x13, 0xDA, 0x6D} };
const GUID CLSID_Saludo = {0x6B9AA065, 0x8FDA, 0x4DC6,{ 0xAC,
0xBB, 0x79, 0x43, 0x3E, 0xB3, 0xEE, 0xD9} };
const GUID IID_ISaludo = {0x973EED57, 0x0F6D, 0x4127,{ 0x97, 0x8B,
0xF4, 0xBD, 0xC0, 0x10, 0x34, 0xB9} };
}; // namespace Sdcom1lib_tlb
18
COM/DCOM
En este grfico se muestra la ventana del programa cliente, al fondo,
y la ventana del servidor que luego programaremos al frente.
19
COM/DCOM
20
COM/DCOM
Como dijimos anteriormente, un servidor COM puede contener
varios objetos. Ahora vamos a crear un objeto COM. Para ello, haremos
click con el botn derecho del ratn encima del proyecto, en el visor de
clases y seleccionaremos New ATL Object.
.
21
COM/DCOM
22
COM/DCOM
COM/DCOM
Introduciremos un pequeo cdigo que haga aparecer una ventana en
el SERVIDOR, en la que muestre el valor que ha recibido.
STDMETHODIMP CSaludo::Recibir(LONG hora)
{
char *mensaje = new char[50];
sprintf(mensaje, "Me han llamado con el numero: %d", num);
::MessageBox(NULL, mensaje, "Ventana del Servidor", MB_OK );
delete [] mensaje;
return S_OK;
}
Y ya solo queda compilar y probar. Visual C++ tras la compilacin,
registra el objeto para que pueda ser usado por otros programas.
COM/DCOM
LTIMAS
PALABRAS
Acabo este breve documento an sabiendo que quedan muchas,
muchsimas cosas en el tintero. Apenas mencion el paso de parmetros, ni
los usos que se pueden dar, ni expliqu cmo funcionaba el proxy... Por no
mencionar que no he hablado nada de ActiveX, ni de la factora de objetos,
ni ...
Sobre las funcionalidades, me falta comentar que el modelo COM es
usado en las aplicaciones multi tier de Bases de Datos.
25
COM/DCOM
BIBLIOGRAFA
Documentos electrnicos:
Microsoft MSDN. Referencia oficial de los creadores.
o http://msdn.microsoft.com/workshop/components/toc.htm
o http://msdn.microsoft.com/workshop/components/com/tutorial
/lessons.asp
o http://msdn.microsoft.com/library/default.asp ( Books, Inside
OLE )
Understanding DCOM. , William Rubin y Marshall Brain. Varios
artculos con ejemplos prcticos en Microsoft Visual C++.
o http://journal.iftech.com/articles/dcom_1/
o http://journal.iftech.com/articles/dcom_2/
o http://journal.iftech.com/articles/dcom_3/
La cara oculta de C++ Builder 4, Ian Marteens. Excelente libro sobre
programacin en Windows.
o http://www.marteens.com/The Dark Side of Cppb.zip
* Sun Microsystems, Inc. RPC: Remote procedure call protocol
specification. Internet Working Group Request for Comments, ( RFC 1057,
April 1988; RFC 1831, Agosto 1995 )
Libros:
Francisco Charte. Programacin Avanzada con C++ Builder 4.
Anaya Multimedia ( ISBN 84-415-0860-7 ). Ejemplos de clientes.
Francisco Charte. Programacin avanzada en Windows 98. Anaya
Multimedia (ISBN 84-415-0832-1 ). Ejemplos de clientes.
26
COM/DCOM
Ian Marteens. La cara oculta de Delphi. Danysoft Internacional
(ISBN 84-283-9999-9). Ejemplos y teora de clientes y servidores COM.
Francisco Javier Ceballos. Programacin orientada a objetos con C+
+ (ISBN 84-7897-268-4 ). Cuando se obscurece el mundo de la
programacin orientada a objetos vuelvo a este libro. Un libro de referencia
de C++ escrito por un nativo del castellano.
27