DCOM y Visual C++
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:
|
Añadimos a nuestro interfaz un método
Decimos que retorne una cadena de
caracteres
çç
Y vemos como ha quedado el interfaz
//
// El
// la
[
library {
[ {
};
[ {
}; };
|
El método se ha implementado en nuestra
clase encargada de su implementación… que simplemente retorna la fecha …
BSTR CdcombasicoDlgAutoProxy::retornaHora(void)
{
AFX_MANAGE_STATE(AfxGetAppModuleState());CString strResult;
// TODO: Add your dispatch handler code here
CTime hora = CTime::GetCurrentTime();
strResult = hora.Format(«%d/%m/%Y»);return strResult.AllocSysString();
}
Una parte de código que nos interesa … el
nombre necesario para crearlo por el cliente por nombre
// La macro
//
|
Creación del cliente
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 {
// if {
}
|
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
Creamos 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 {
} {
} }
|
Y ejecutamos.
Veremos que todo funciona correctamente
Otros temas avanzados
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; |
Conclusiones
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 …..