Você está na página 1de 27

COM/DCOM

COM/DCOM
en C++

Alumno: Francisco ngel Gimeno Domnech


Curso 2000/2001

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

Existen multitud de bibliotecas de objetos. Una de las ms


extendidas es la de los componentes COM. De hecho, los sistemas
Windows de Microsoft usan esa tecnologa. Y no slo es que la usen, sino
que estn basados en componentes COM. COM significa Component
Object Model. COM es un modelo. Es un modelo binario, que puede ser
utilizado independientemente de los lenguajes de programacin que puedan
soportarlo. CORBA es otro de los modelos que compite con COM.
En este documento veremos como se usan, crean y registran los
componentes COM utilizando un compilador de C++ ( usando el entorno
de desarrollo Borland C++ Builder ), dejando a un lado el lenguaje IDL
( para la declaracin de los objetos ).
Un componente es un objeto ( como los objeto de las clases de C++)
que incluye unas caractersticas mnimas, para que puedan ser utilizados
tanto en un programa como en la etapa de diseo del mismo. Existen otros
modelos de componentes como los modelos de Borland, OWL y VCL. Sin
embargo, slo los componentes COM pueden utilizarse en mltiples
lenguajes, de ah que estn ms extendidos. Adems, las distintas partes del
propio sistema operativo estn realizadas con COM. As, por ejemplo, los
mens contextuales, las libreras grficas DirectX, la creacin de enlaces a
ficheros, las distintas aplicaciones de Microsoft Office, etc... son objetos
COM, que pueden ser utilizados desde cualquier programa.
Sin embargo, la creacin de componentes es algo complicada y
tediosa. Por ello se suele usar una librera de plantillas de macros que
facilitan la tarea de creacin de componentes.

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 ).

Por qu y para qu COM?


COM viene incluido como parte de Windows. Es ms, muchas partes
de Windows son objetos COM. Si el programador quiere realizar una
extensin del sistema operativo, tendr que realizar un objeto COM. El
desarrollo de un Sistema Operativo lo realizan multitud de personas.
Encontrar un modelo que se adapte al desarrollo global del sistema es
difcil. La programacin orientada a objetos es una alternativa. COM
realiza esta programacin a nivel de programas binarios, en contra de lo
que suele ser normal. Es decir, no hace falta tener los cdigos fuentes del
objeto para poder usarlo.
DCOM se puede usar en redes de una forma muy transparente, lo
que nos permite la programacin a varios niveles.
Podemos aprovechar las ventajas de las DLLs ( Libreras de Enlace
Dinmico ) en el modelo de componentes. Entre estas ventajas estn:
- Minimizar el uso de memoria de programas ( al existir slo
una copia de las funciones en memoria )
- Las actualizaciones de las libreras realizan mejoras sobre
todos los programas que las usan ( aunque esto es un
inconveniente, pues todas las nuevas versiones deben de ser
compatibles 100% con las anteriores )
- Se pueden usar y escribir funciones de/desde distintos
lenguajes de programacin.
Sin embargo, la principal desventaja es la complejidad del tema.

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 ).

Identificacin del servidor


Es normal que un servidor de componentes contenga varios objetos
COM. Se nos presenta un problema a la hora de identificar que componente
queremos usar cuando el componente reside en un lugar distinto al cliente (
cuando por ejemplo, el servidor COM est fuera del ejecutable que lo
utiliza ). Una posible forma de hacerlo sera con un nombre. Sin embargo
esto no es factible, pues 2 programadores distintos podran usar el mismo
nombre para componentes distintos ( por ejemplo, el caso de un
componente muy usado como un botn ).
La solucin de Microsoft es otra. Para identificar cualquier cosa
que necesite una unicidad, usa una secuencia de 128 bits. En teora,
Microsoft debera de dar estos nmeros ( as como Internic asigna
direcciones IP, o los fabricantes de tarjetas de red asignan las MAC ). Sin
embargo, con 128 bits la posibilidad de conflicto es prcticamente nula
( usando una funcin que nos proporciona Microsoft, en la que genera un
nmero aleatorio, lo mezcla con informacin del equipo que ejecuta la
funcin, etc ... ). Esta secuencia en general se llama GUID ( Identificador
nico global ). Los GUIDs se pueden utilizar para otras cosas aparte de los
6

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

Diferencias entre C++ y COM


COM es distinto a C++. Los objetos COM son bastantes ms
complicados. Muchas de estas complicaciones vienen del hecho de la
arquitectura Cliente/Servidor que se puede realizar a travs de redes. Hay
cuatro consideraciones bsicas que diferencian a C++ y COM:
- Los objetos en C++ siempre se ejecutan en el mismo
proceso. Los objetos COM pueden ejecutarse estando el
cliente en otro proceso que el servidor, o incluso en otro
ordenador.
- Los mtodos de los objetos COM se pueden llamar a travs
de una red.
- Los nombres de los mtodos de C++ deben de ser nicos en
el proceso y los nombres de los mtodos de COM deben de
ser nicos en el mundo.
- Los servidores COM pueden ser escritos en variedad de
lenguajes y en sistemas operativos distintos, mientras que
los objetos escritos en C++ son siempre escritos en C++.
As pues, con C++ podemos escribir objetos COM.
Otro aspecto interesante es el de la creacin de objetos. En C++ es el
cliente el que asigna la memoria para el objeto y el constructor de ste
termina por reservar memoria para sus miembros. En un objeto COM, al
poder crearse objetos remotamente debe de existir un mecanismo para la
creacin del objeto a distancia y otro para la comunicacin. En el primer
caso, es el servidor COM el que realiza la gestin de memoria y
CLSID_IHombre

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.

Tipos de servidores COM


Anteriormente hemos visto que existen varios tipos distintos de
servidores COM. Entre ellos estn los objetos COM que se alojan en
DLLs, los que se alojan en un ejecutable y los que se alejan en otra
mquina de una red. Vamos a ver el problema de la comunicacin entre
cliente y servidor ( para el paso de parmetros ).

Servidores COM en DLL


Esta es la forma ms sencilla de funcionamiento del modelo COM.
Cliente y Servidor comparten un espacio de direcciones y un mapa de
memoria. La carga del objeto COM desde el DLL se hace de forma
transparente al usuario. La comunicacin se puede realizar con el paso de
parmetros normal fijado para una DLL ( incluyendo eso s, como
parmetros tambin, un puntero a la instancia del objeto ).
Es el programa cliente el que realiza la creacin de memoria para
comenzar la creacin del objeto COM. Al entrar en ejecucin el constructor
del objeto, ste podra realizar peticiones de memoria dinmica.

Servidores COM en EXE


Son llamados servidores locales. Se ejecutan en el mismo ordenador
que el cliente, pero en procesos distintos. La comunicacin la gestiona el
sistema operativo. No hace falta que est el ejecutable del servidor
funcionando, pues el sistema es capaz de ejecutarlo. El exe contiene una
parte que se encarga de la gestin de memoria inicial que requieren los
objetos COM.

Servidores COM remotos o DCOM


Cliente y servidor se encuentran en ordenadores distintos. La
comunicacin la gestiona el sistema operativo. Internamente, Microsoft usa
el protocolo RPC para realizar la comunicacin. Sin embargo, el programa
servidor debe de estar ejecutndose.
A la hora de la prctica, hay poca diferencia en la programacin. Las
funciones miembro se llaman de la misma forma, los objetos se crean
prcticamente igual ( en servidores remotos se usa la funcin
CoCreateInstanceEx, la cual tiene un parmetro que identifica al ordenador
12

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
);

Veremos primero cdigo del uso de un cliente ya hecho y luego


veremos la implementacin del servidor. Los ejemplos los he realizado con
2 compiladores distintos. Us el Microsoft Visual C++ 6.0 para la
realizacin de los servidores, pues gracias a sus expertos, la realizacin
de un servidor COM se limita a la implementacin de las funciones que
implemente. Para realizar los clientes, us el Borland C++ Builder 5, pues
es una herramienta de desarrollo RAD ( Herramientas de Desarrollo
Rpido ) que facilita en gran medida la realizacin de los ejemplos.

14

COM/DCOM

Ejemplo de Cliente COM


En este ejemplo veremos cmo crear un objeto COM local. Mi
intencin no es la de explicar todos los pasos, sino verlo por encima y
destacar los aspectos ms importantes.
En C++ Builder se pueden crear aplicaciones fcilmente. La
programacin se basa en Fichas ( Form ). Existe una gran cantidad de
componentes visuales que vienen con el paquete de desarrollo. Estos
componentes son objetos normales de C++, pero en los que todos derivan
directa o indirectamente de la clase TObject. Estos componentes son las
ventanas, los botones, los accesos a bases de datos, las listas, los grficos,
etc...
En nuestro ejemplo, usaremos la ficha que viene por defecto. La

modificaremos y le aadiremos un botn para realizar la accin.


Haciendo Doble Click con el botn izquierdo del ratn, se nos abrir
una pantalla de edicin de cdigo fuente. El cursor se posiciona tras la llave
de una funcin, indicndonos que se ser el cdigo que se ejecutar
cuando se pulse el botn ( realmente, es la respuesta que da la ficha al
evento OnClick del botn ). El cdigo introducido es el siguiente:

15

COM/DCOM

Sin embargo, todava no es suficiente para que funcione. Pues hemos


usado CLSID_Saludo, IID_ISaludo e ISaludo en nuestro cdigo. El
compilador no conoce esas esas referencias ni la clase ISaludo.
Una vez que el objeto COM est en nuestro sistema, est almacenado
en el registro de Windows datos acerca de l. Esos datos son por ejemplo su
CLSID, los IID de las interfaces que soporta, la localizacin del fichero
donde reside ( .DLL o .EXE ) o los ordenadores de la red en los que est
disponible ese objeto.
Los compiladores con soporte de COM traen una utilidad para
extraer esta informacin ( y ms, como la declaracin de las interfaces ) a
partir del registro de Windows.

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

parte del SDCOM1Lib_TBL.h


//
**********************************************************//
// Interface: ISaludo
// Flags: (0)
// GUID:
{973EED57-0F6D-4127-978B-F4BDC01034B9}
//
***********************************************************//
interface ISaludo : public IUnknown
{
public:
// [-1] method Recibir
virtual HRESULT STDMETHODCALLTYPE Recibir(long hora/*[in]*/)
= 0;
};
Como se puede observar, el cdigo generado por el Importador de
Libreras de Tipo, ha extrado la informacin del objeto COM que nos
interesa. Ahora, lo nico que queda hacer es incluir este fichero de cabecera
en el fichero del cdigo de la ficha. Se compila, y si todo va bien, debera
funcionar.

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.

Ejemplo de Servidor COM


La creacin de un servidor COM puede llegar a ser una tarea
compleja. Sin embargo, los nuevos entornos de desarrollo intentan suavizar
esta tarea. Para hacer el servidor utilic otro paquete distinto, el Visual C++
6.0, el cual trae Wizards para la creacin de objetos COM. La realizacin
de este objeto no entraa dificultad, pues slo tiene una interfaz ( aparte de
IUnknown ), que adems slo contiene un mtodo, Recibir([in] long Hora).
Si ha observado bien, la declaracin del mtodo tiene un [in] delante del
parmetro, lo cual significa que es un parmetro de entrada ( ver la
documentacin RPC al respecto ). Lo que devuelve la funcin es un
HRESULT que nos dir si la llamada a la funcin fue correcta o no. Si lo
que queremos es tener parmetros de salida, basta con especificar [out,
retval ].
Pues, manos a la obra. Al seleccionar new, del men File, tendremos
esto:

Seleccionaremos ATL COM AppWizard, y continuaremos.


Realmente, esto no es el objeto, sino una aplicacin que contendr los
objetos COM.

19

COM/DCOM

Crearemos un fichero EXE, para poder usarlo remotamente


( recordemos que el servidor remoto debe de estar a la escucha de las
peticiones, y por lo tanto funcionando ). Una vez dado a Finish, podremos
ver en el inspector de clases lo siguiente:

Estas clases, mtodos y datos miembros los crea automticamente el


entorno. Contiene cdigo para registrar y borrar el objeto del Registro de
Windows, para crear los objetos COM, para crear los hilos de ejecucin de
los objetos, etc. El entorno tambin ha creado una clase llamada
CExeModule, que no es ms que el que se encarga de gestionar y crear los
distintos objetos COM que puede albergar el servidor.

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.
.

Seguidamente, nos aparecer una ventana como esta:


En esta
ventana

seleccionaremos el tipo de Objeto COM que vamos a crear. Usaremos un


objeto simple ( Simple Object ).

21

COM/DCOM

Y una vez, que le demos a aceptar, tendremos casi todo el trabajo


hecho. Slo nos queda aadir un mtodo y tendremos el objeto listo para
compilarlo.
Ahora en el Visor de Clases nos aparece esta clase que hemos creado,
con una interfaz por defecto del mismo nombre, pero empezando por I.

Nos queda aadir el nuevo mtodo, y para ello volvemos a pulsar


con el ratn, con el botn derecho, encima de la interfaz ISaludo y
seleccionaremos Add Method.

22

COM/DCOM

y aadimos el nombre del mtodo, con su parmetro de entrada.

Tras darle a OK, en nuestro cdigo aparecern unas lneas nuevas.


STDMETHODIMP CSaludo::Recibir(LONG hora)
{
// TODO: Add your implementation code here
return S_OK;
}
23

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.

Probndolo en distintas mquinas


Tal como est hecho, este objeto COM funciona sin problemas en la
misma mquina. Para hacer que funcione entre 2 mquinas distintas, se
puede optar por 2 soluciones.
1) Usar el programa dcomcnfg

2) Cambiar el cdigo del cliente para que sepa l mismo localizar al


objeto, usando la funcin CoCreateClassEx en vez de
CoCreateClass.
24

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

Você também pode gostar