MFCATL, exemple : utilise des objets ATL COM dans un serveur MFC
Mise à jour : novembre 2007
L'exemple MFCATL montre comment utiliser les objets COM ATL dans un fichier exécutable de serveur MFC.
Le serveur permet la création de deux objets : ObjectOne (implémenté dans MFC et prenant en charge une interface dispinterface) et ObjectTwo (implémenté dans ATL et prenant en charge une interface double).
Note de sécurité : |
---|
Cet exemple de code est fourni pour illustrer un concept et ne doit pas être utilisé dans des applications ou des sites Web, car il peut ne pas illustrer les pratiques de programmation les plus sûres. Microsoft n'assume aucune responsabilité pour tout dommage indirect ou consécutif en cas d'utilisation de l'exemple de code à des fins autres que celles prévues. |
Pour obtenir des exemples et des instructions d'installation :
Dans le menu ? (Aide) de Visual Studio, cliquez sur Exemples.
Pour plus d'informations, consultez Recherche des fichiers d'exemple.
La liste la plus récente et la plus complète d'exemples est disponible en ligne à partir de la page Visual Studio 2008 Samples.
Des exemples sont également disponibles sur le disque dur de votre ordinateur. Des exemples et un fichier Readme sont copiés par défaut dans un dossier sous \Program Files\Visual Studio 9.0\Samples\. Pour les éditions Express de Visual Studio, tous les exemples sont accessibles en ligne.
Génération et exécution de l'exemple
Pour générer et exécuter l'exemple
Ouvrez le fichier solution mfcatl.sln.
Dans le menu Générer, cliquez sur Générer la solution.
Dans le menu Déboguer, cliquez sur Exécuter sans débogage. Vous exécutez ainsi le serveur mfcatl.exe hors connexion et effectuez son inscription.
Ouvrez le fichier mfcatl.htm dans votre navigateur Web et cliquez sur les boutons appelant les objets appropriés. Vous pouvez appeler chaque objet individuellement ou les deux à la fois.
Notes relatives à la conversion
À l'origine, les deux objets MFCATL ont été implémentés dans MFC. Ils sont tous les deux dérivés de CCmdTarget. ObjectTwo a été réimplémenté avec ATL selon la procédure suivante :
Ajoutez les fichiers d'en-tête ATL (Atlbase.h et Atlcom.h) à Premfcat.h.
Ajoutez Atlimpl.cpp à Premfcat.cpp.
Ajoutez une classe dérivée de CComModule à Prefcat.h (comme dans l'exemple d'exécutable BEEPER). La classe dérivée implémente les méthodes Lock et Unlock pour transmettre le nombre des verrous à MFC en appelant AfxOleLockApp et AfxOleUnlockApp.
Ajoutez une paire de macros de mappage d'objet (BEGIN_OBJECT_MAP/END_OBJECT_MAP) à Mfcatl.cpp et ajoutez une instance statique de la classe de module appelée _Module.
Appelez _Module.Init et Term à partir de InitInstance et de ExitInstance.
Ajoutez la typelib en tant que ressource.
Appelez _Module.RegisterServer(TRUE) à partir de InitInstance pour correspondre à l'appel MFC à COleObjectFactory::UpdateRegistryAll.
Appelez _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE) pour correspondre à la macro REGCLS_MULTIPLEUSE des fabriques de classes de MFC, ce que fait implicitement la macro IMPLEMENT_OLECREATE.
Réimplémentez ObjectTwo dans ATL en procédant comme suit :
Modifiez le fichier ODL de dispinterface en interface double.
Faites générer à la compilation ODL un fichier d'en-tête (Interf.h) dont ATL a besoin.
Réécrivez les fichiers .h et .cpp (la méthode la plus rapide consiste à exécuter les Assistants ATL et à copier/coller, puis renommer le code généré automatiquement à la place du code MFC d'origine).
Ajoutez un OBJECT_ENTRY(CLSID_ObjectTwo, CObjectTwo) au mappage d'objets ATL.
Autres étapes de conversion possibles (non traitées ici) :
Portage du fichier ODL dans le format IDL.
Ajout de prise en charge pour les arguments de la ligne de commande -RegServer et -UnregServer.
Mots clés
Cet exemple utilise les mots clés suivants :
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