Creación del servidor
de Automatización OLE
Sin duda, el entorno de trabajo en el
que más horas he invertido en el pasado (miles de horas)
ha sido Microsoft
Visual C++. Simplemente me parece una obra maestra
….
De vez en cuando me toca volver a él para hacer
alguna cosilla y voy a aprovechar parra compartir con vosotros
como se hacen (y no se hacen) algunas cositas, hoy relacionadas
con el desarrollo de
clientes y
servidores de
automatización OLE.
Dando por echo que lo tenéis instalado y lo
arrancamos. De una versión a otra cambian algunas cosas de
aspecto pero los conceptos son los mismos.
Creación del
servidor de
Automatización OLE
Creamos un nuevo proyecto
Elegimos una aplicación Visual C++ basada en un
diálogo.
El echo de que sea un diálogo solo es para que
podamos ver que se arranca al ser invocado como un servidor de
automatización y para que se registren todos los
componentes en otra máquina con solo ejecutarlo (lo suyo
sería crearlos como servidores ATL)
Elegimos las opciones de configuración
básica.
No se os olvide pinchar la opción de
automatización
Revisamos los nombres de las clases que se van a
generar
Vemos el aspecto de la aplicación y configuramos
el diálogo con el editor de recursos
Debemos revisar los componentes creados, sobre
todo el señalado (el interfaz) que en nuestro caso se
llama Idombasico.
Nota: Lo importante de la tecnología de componentes es que Un componente en sí es solamente una Una vez definido un interfaz, este Es una mala práctica ir Una vez que una aplicación está
|
Añadimos a nuestro interfaz un
método
Decimos que retorne una cadena de
caracteres
çç
Y vemos como ha quedado el interfaz
// dcombasico.idl: código fuente de la biblioteca de tipos para el archivo dcombasico.exe // El compilador MIDL procesará este // la biblioteca de tipos [ uuid(645FB5A1-1591-4B8D-8FA9-1CBC0D1CC9A5), library dcombasico { //
[ dispinterface {
}; //
[ coclass { }; }; |
El método se
ha implementado en nuestra clase encargada de su
implementación… que simplemente retorna la fecha
…
BSTR CdcombasicoDlgAutoProxy::retornaHora(void) CString strResult; // TODO: Add your dispatch handler code here return strResult.AllocSysString(); |
Una parte de código que nos interesa … el
nombre necesario para crearlo por el cliente por
nombre
// La macro IMPLEMENT_OLECREATE2 se define en // IMPLEMENT_OLECREATE2(CdcombasicoDlgAutoProxy,
|
Elegimos una aplicación Visual C++
MFC
Igualmente basada en diálogo
Elegimos las opciones y no marcamos el soporte de
automatización
Pero para que funcione el ejemplo necesitamos
añadir a mano estas líneas
BOOL CclientedcomApp::InitInstance() {
|
Creamos un diálogo básico
Y revisamos que nuestro interfaz y servidor que lo
implementa están registrados en el sistema
ActiveX Control Test
Container (en el menú Tools)
Vemos el detalle
Y el interfaz en el registro
Ahora añadimos una clase nueva, pinchando el
botón derecho del editor
C
reamos la clase desde un fichero
descriptor
Elegimos el componente servidor
Y revisamos el código generado
Y añadimos el código al invocar el
botón (no se os olvide incluir el .h):
#include "Cdcombasico.h"
void { // TODO: Add COleException
try } catch { } } |
Y ejecutamos.
Veremos que todo funciona correctamente
Ojito con estos ejemplos…. la tecnología de
componentes es algo serio y requiere formación y
experiencia.
Si miráis un poquito el código, en el
servidor de automatización OLE se crea una cadena (que se
sube a la memoria
compartida) que se consume en el cliente ¿y quién
la limpia? Este código generado desde el asistente,
¿dejará lagunas de memoria …. no
detectable por el depurador?
Os aconsejo que miréis este
artículo
http://www.codeguru.com/forum/showthread.php?t=231156
y esta porción de código BSTR bstr; |
Los entornos de desarrollo son cada día
más potentes e impresionantes pero esto no quita para que
realicemos un estudio profundo de las tecnologías base en
las que se apoya.
En la mayoría de las empresas, la
gente utiliza los entornos de desarrollo de Microsoft por lo
rápido que podemos ponernos en marcha…. los problemas
vienen en ejecución y cuando queremos ampliar la
funcionalidad haciendo cosas que ya no nos hacen los asistentes
(Wizards) automáticamente (por fallas graves de conceptos
esenciales)…. pero bueno …. de algo tenemos que vivir los
demás …..
Roberto Canales Mora
www.adictosaltrabajo.com