Ejemplo MFCATL: utiliza objetos ATL COM en un servidor MFC

Actualización: noviembre 2007

El ejemplo MFCATL ilustra cómo utilizar objetos COM de ATL en un servidor EXE de MFC.

El servidor permite la creación de dos objetos: ObjectOne (se implementa en MFC y admite una dispinterface) y ObjectTwo (se implementa en ATL y admite una interfaz dual).

Nota de seguridad:

Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que quizás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para obtener ejemplos e instrucciones para su instalación:

  • En el menú Ayuda de Visual Studio, haga clic en Ejemplos.

    Para obtener más información, vea Localizar archivos de ejemplo.

  • La lista de ejemplos completa con la versión más reciente está disponible en línea en la página Visual Studio 2008 Samples.

  • También encontrará ejemplos en el disco duro de su equipo. De manera predeterminada, los ejemplos y el archivo Léame se copian en una carpeta bajo \Archivos de programa\Visual Studio 9.0\Samples\. Para las versiones Express de Visual Studio, todos los ejemplos están en línea.

Generar y ejecutar el ejemplo

Para generar y ejecutar este ejemplo

  1. Abra el archivo de solución mfcatl.sln.

  2. En el menú Generar, haga clic en Generar solución.

  3. En el menú Depurar, haga clic en Iniciar sin depurar. Esto hará que se ejecute el servidor mfcatl.exe en modo independiente y se registre.

  4. Abra el archivo mfcatl.htm en el explorador web y haga clic en los botones que permiten llamar a los objetos apropiados. Puede llamar a cada objeto individualmente o a ambos a la vez.

Observaciones sobre la conversión

Originalmente, los dos objetos MFCATL se implementaron en MFC. Ambos se derivaban de CCmdTarget. ObjectTwo se volvió a implementar mediante ATL siguiendo estos pasos:

  1. Incluir los archivos de encabezado ATL (Atlbase.h y Atlcom.h) en Premfcat.h.

  2. Incluir Atlimpl.cpp en Premfcat.cpp.

  3. Agregar una clase derivada de CComModule a Prefcat.h (de forma similar al ejemplo EXE BEEPER). La clase derivada implementa los métodos Lock y Unlock para reenviar los recuentos de bloqueos a MFC mediante llamadas a AfxOleLockApp y AfxOleUnlockApp.

  4. Agregar un par de macros de mapa de objeto (BEGIN_OBJECT_MAP/END_OBJECT_MAP) en Mfcatl.cpp y agregar una instancia estática de la clase de módulo denominada _Module.

  5. Llamar a _Module.Init y Term desde InitInstance y ExitInstance.

  6. Agregar la biblioteca de tipos como un recurso.

  7. Llamar a _Module.RegisterServer(TRUE) desde InitInstance, que equivale a la llamada MFC a COleObjectFactory::UpdateRegistryAll.

  8. Llamar a _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE), que equivale a REGCLS_MULTIPLEUSE de los generadores de clases de MFC, lo cual se realiza implícitamente mediante la macro IMPLEMENT_OLECREATE.

  9. Volver a implementar ObjectTwo en ATL mediante estos pasos:

    • Cambiar el archivo ODL de dispinterface a interfaz dual.

    • Hacer que la compilación ODL genere un archivo de encabezado (Interf.h) necesario para ATL.

    • Volver a escribir los archivos .h y .cpp (el modo más rápido consiste en ejecutar los asistentes de ATL y copiar, pegar y cambiar el nombre del código generado automáticamente en lugar del código MFC original).

    • Agregar un objeto OBJECT_ENTRY(CLSID_ObjectTwo, CObjectTwo) al mapa de objetos de ATL.

Otros pasos de conversión adicionales (no se contemplan aquí):

  • Trasladar el archivo ODL al formato IDL.

  • Permitir el uso de los argumentos de línea de comandos -RegServer y -UnregServer.

Palabras clave

En este ejemplo se utilizan las siguientes palabras clave:

AfxMessageBox; AfxOleInit; AfxOleLockApp; AfxOleUnlockApp; ASSERT; BEGIN_COM_MAP; CCmdTarget; CCmdTarget::OnFinalRelease; CComCoClass; CComModule; CComModule::GetLockCount; CComModule::Lock; CComModule::Unlock; CComObjectRoot; CDialog; CMenu::AppendMenu; COleObjectFactory::RegisterAll; COleObjectFactory::UpdateRegistryAll; COM_INTERFACE_ENTRY; CString::IsEmpty; CString::LoadString; CWindow::GetSystemMenu; DECLARE_DYNCREATE; DECLARE_NOT_AGGREGATABLE; DECLARE_REGISTRY; DestroyWindow; EnableAutomation; GetClientRect; GetSystemMetrics; IDispatchImpl; PostMessage; SendMessage; SetIcon; ShowWindow; SysAllocString

Vea también

Otros recursos

Ejemplos de ATL