Fecha de creación del tutorial: 2005-06-22
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
|
// dcombasico.idl: código fuente de la biblioteca de tipos para el archivo dcombasico.exe
// El compilador MIDL procesará este archivo para generar // la biblioteca de tipos (dcombasico.tlb).
[ uuid(645FB5A1-1591-4B8D-8FA9-1CBC0D1CC9A5), version(1.0) ] library dcombasico { importlib("stdole32.tlb"); importlib("stdole2.tlb");
// Interfaz de envío principal para CdcombasicoDoc
[ uuid(DE8D669B-1D2A-41FA-A5A3-9BBA147F02C0) ] dispinterface Idcombasico { properties:
methods: [id(1), helpstring("method retornaHora")] BSTR retornaHora(void); };
// Información de clase para CdcombasicoDoc
[ uuid(65360127-D82B-484E-BC54-E6129CDF864C) ] coclass dcombasico { [default] dispinterface Idcombasico; }; };
|
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 IMPLEMENT_OLECREATE2 se define en el archivo StdAfx.h de este proyecto // {65360127-D82B-484E-BC54-E6129CDF864C} IMPLEMENT_OLECREATE2(CdcombasicoDlgAutoProxy, "dcombasico.Application", 0x65360127, 0xd82b, 0x484e, 0xbc, 0x54, 0xe6, 0x12, 0x9c, 0xdf, 0x86, 0x4c)
|
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 CclientedcomApp::InitInstance() { ……….
// Inicializar bibliotecas OLE if (!AfxOleInit()) { AfxMessageBox("Error al incializar OLE"); return FALSE; }
|
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 CclienteligeroDlg::OnBnClickedButton1() { // TODO: Add your control notification handler code here COleDispatchDriver disp; COleException *e = new COleException;
try { // Create instance of Microsoft System Information Control // by using ProgID. if (disp.CreateDispatch("dcombasico.Application", e)) { Cdcombasico a = Cdcombasico(disp); CString x = a.retornaHora(); AfxMessageBox("Todo ha funcionado " + x);
}
disp.DetachDispatch(); } catch (COleDispatchException * e) { AfxMessageBox(e->m_strDescription); e->Delete(); } }
|
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 .....
Anímate y coméntanos lo que pienses sobre este tutorial
Puedes opinar o comentar cualquier sugerencia que quieras comunicarnos sobre este tutorial; con tu ayuda, podemos ofrecerte un mejor servicio.
| Autor | Mensaje de usuario registrado |
|---|
- Puedes inscribirte en nuestro servicio de notificaciones haciendo clic aquí.
- Puedes firmar en nuestro libro de visitas haciendo clic aquí.
- Puedes asociarte al grupo AdictosAlTrabajo en XING haciendo clic aquí.
- Añadir a favoritos Technorati.
Esta obra está licenciada bajo licencia Creative Commons de
Reconocimiento-No comercial-Sin obras derivadas 2.5
Recuerda
Autentia te regala la mayoría del conocimiento aquí compartido (Ver todos los tutoriales). Somos expertos en: J2EE, Struts, JSF, C++, OOP, UML, UP, Patrones de diseño ... y muchas otras cosas.
¿Nos vas a tener en cuenta cuando necesites consultoría o formación en tu empresa?, ¿Vas a ser tan generoso con nosotros como lo tratamos de ser con vosotros?
Somos pocos, somos buenos, estamos motivados y nos gusta lo que hacemos ...
Autentia = Soporte a Desarrollo & Formación.
Tutoriales recomendados
| Nombre | Resumen | Visitas | Valoración | Votos | ||
|---|---|---|---|---|---|---|
| Instalar OpenESB 2.1 e Introducción | En este tutorial veremos como descargar e instalar OpenESB y explicaremos sus funcionalidades | 2009-12-03 | 1701 | - | - | ![]() |
| Tutorial básico sobre Google Application Engine | En este tutorial veremos cómo ejecutar una simple aplicación web en la infraestructura de Google | 2009-11-12 | 1937 | Bueno | 1 | ![]() |
| Instalación de Glassfish 2.1 | En este tutorial nos veremos cómo instalar el servidor de aplicaciones GlassFish. Además veremos los primeros pasos, como entrar en la consola de administración del servidor, y desplegar una aplicación EAR (Enterprise Application) | 2009-11-11 | 2705 | Bueno | 1 | ![]() |
| Integración con sistemas de Bug Tracking desde NetBeans 6.7 | En este tutorial vamos a examinar el soporte que proporciona NetBeans para la integración con sistemas de Bug Tracking. | 2009-09-21 | 2603 | - | - | ![]() |
| Instalación y configuración de Eclipse Galileo | Instalar y configurar el nuevo entorno de desarrollo Eclipse Galileo | 2009-07-07 | 10647 | - | - | ![]() |
| UploadFile con Icefaces + Hibernate + Anotaciones | Este tutorial pretende servir de guía de inicio para todos aquellos usuarios que comienzan a dar sus primeros pasos en ICEfaces, JSF e Hibernate | 2009-06-08 | 3088 | - | - | ![]() |
| Cómo hacer UML con Eclipse y el plugin UML2 | En este tutorial vamos a ver como podemos hacer modelos de UML con el plugin de Eclipse UML2. | 2009-04-13 | 10454 | Muy bueno | 1 | ![]() |
| Pruebas Software con Junit 4 y Eclipse | Junit se trata de un framework muy conocido en el mundo de los desarrolladores que con este tutorial intentamos acercar a quienes empiezan en este mundillo | 2009-01-20 | 7322 | - | - | ![]() |
| Solución a NoClassDefFoundError: SWTResourceUtil | Solución a NoClassDefFoundError: org/eclipse/ui/internal/util/SWTResourceUtil | 2009-01-14 | 2185 | - | - | ![]() |
| Primeros pasos por el mundo Java/Eclipse (en Vista) | En esta ocasión Roberto nos enseña de una manera sencilla como empezar a usar el entorno de desarrollo Eclipse para realizar nuestros proyectos Java. | 2008-11-03 | 6673 | - | - | ![]() |
Nota:
Los tutoriales mostrados en este Web tienen como objetivo la difusión del conocimiento.
Los contenidos y comentarios de los tutoriales son responsabilidad de sus respectivos autores.
En algún caso se puede hacer referencia a marcas o nombres cuya propiedad y derechos es de sus respectivos dueños. Si algún afectado desea que incorporemos alguna reseña específica, no tiene más que solicitarlo.
Si alguien encuentra algún problema con la información publicada en este Web, rogamos que informe al administrador rcanales@adictosaltrabajo.com para su resolución.







