Esempio MFCATL: utilizzo di oggetti COM ATL in un server MFC

Aggiornamento: novembre 2007

Nell'esempio MFCATL viene illustrato l'utilizzo di oggetti COM ATL in un file EXE di un server MFC.

Il server consente la creazione di due oggetti: ObjectOne, che viene implementato in MFC e supporta un'interfaccia dispatch, e ObjectTwo, che viene implementato in ATL e supporta un'interfaccia duale.

Nota sulla sicurezza:

Questo esempio di codice viene fornito solo a scopo dimostrativo e non deve essere utilizzato in applicazioni o siti Web, poiché potrebbe non implementare le tecniche migliori a livello di sicurezza. Microsoft esclude ogni responsabilità per danni diretti o indiretti derivanti dall'utilizzo dell'esempio di codice per scopi diversi da quelli previsti.

Per ottenere gli esempi e le istruzioni per l'installazione:

  • In Visual Studio scegliere Esempi dal menu ?.

    Per ulteriori informazioni, vedere Individuazione dei file di esempio.

  • La versione più recente e l'elenco completo degli esempi sono disponibili in linea alla pagina Visual Studio 2008 Samples.

  • È anche possibile trovare gli esempi sul disco rigido del computer. Per impostazione predefinita, gli esempi e il file Leggimi vengono copiati in una cartella nel percorso \Programmi\Visual Studio 9.0\Samples\. Per le versioni Express di Visual Studio, tutti gli esempi sono disponibili in linea.

Generazione ed esecuzione dell'esempio

Per generare ed eseguire l'esempio

  1. Aprire il file di soluzione mfcatl.sln.

  2. Scegliere Genera soluzione dal menu Genera.

  3. Scegliere Avvia senza eseguire debug dal menu Debug. Verrà eseguito il server mfcatl.exe in modo autonomo e ne verrà effettuata la registrazione.

  4. Aprire il file mfcatl.htm nel browser e fare clic sui pulsanti necessari per eseguire chiamate negli oggetti appropriati. È possibile chiamare ciascun oggetto singolarmente oppure entrambi gli oggetti contemporaneamente.

Osservazioni sulla conversione

In origine, entrambi gli oggetti MFCATL erano implementati in MFC. Entrambi derivavano da CCmdTarget. ObjectTwo è stato reimplementato mediante ATL attenendosi alla procedura riportata di seguito.

  1. Includere i file di intestazione ATL (Atlbase.h e Atlcom.h) in Premfcat.h.

  2. Includere Atlimpl.cpp in Premfcat.cpp.

  3. Aggiungere una classe derivata da CComModule a Prefcat.h, analogamente all'esempio di file EXE di BEEPER. Nella classe derivata sono implementati i metodi Lock e Unlock per inoltrare i conteggi dei blocchi a MFC mediante la chiamata a AfxOleLockApp e AfxOleUnlockApp.

  4. Aggiungere una coppia di macro di mappe oggetto (BEGIN_OBJECT_MAP/END_OBJECT_MAP) in Mfcatl.cpp e aggiungere un'istanza statica della classe Module denominata _Module.

  5. Chiamare _Module.Init e Term da InitInstance e ExitInstance.

  6. Aggiungere la libreria dei tipi come risorsa.

  7. Chiamare _Module.RegisterServer(TRUE) da InitInstance per mantenere la corrispondenza con la chiamata di MFC a COleObjectFactory::UpdateRegistryAll.

  8. Chiamare _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE) per mantenere la corrispondenza con REGCLS_MULTIPLEUSE delle class factory di MFC, come eseguito in modo implicito dalla macro IMPLEMENT_OLECREATE.

  9. Reimplementare ObjectTwo attenendosi alla seguente procedura.

    • Modificare il file ODL trasformando l'interfaccia dispatch in un'interfaccia duale.

    • Impostare la compilazione ODL in modo che venga generato un file di intestazione (Interf.h) necessario per ATL.

    • Riscrivere i file H e CPP. Il modo più semplice consiste nell'eseguire le procedure guidate ATL e nel copiare, incollare e rinominare il codice generato automaticamente in sostituzione del codice MFC originale.

    • Aggiungere un OBJECT_ENTRY(CLSID_ObjectTwo, CObjectTwo) alla mappa oggetto ATL.

Ulteriori operazioni di conversione, non illustrate in questa sede, possono comprendere quanto segue:

  • porting del file ODL in formato IDL

  • aggiunta del supporto per gli argomenti -RegServer e -UnregServer della riga di comando.

Parole chiave

Nell'esempio vengono utilizzate le parole chiave seguenti:

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

Vedere anche

Altre risorse

Esempi relativi ad ATL