Numéro d'article: 173974 - Dernière mise à jour: jeudi 2 juin 2005 - Version: 3.0

Comment ajouter la prise en charge MFC à un projet ATL dans Visual C++

A noterCet article s'applique à un système d'exploitation différent de celui que vous utilisez. Le contenu de l'article qui ne vous concerne peut-être pas est désactivé.

Sommaire

Agrandir tout | Réduire tout

Résumé

Lorsque de la création d'un projet ATL EXE à l'aide de AppWizard, la case à cocher de la prise en charge MFC est désactivée. Cet article explique comment ajouter la prise en charge MFC à un projet ATL EXE. Cet article explique également comment ajouter la prise en charge MFC à un projet ATL DLL si vous n'a pas pu être initialement activez-la «prise en charge MFC» dans l'Assistant AppWizard.

Plus d'informations

Ajout de la prise en charge MFC à un projet ATL EXE

  1. Ajoutez ce qui suit # include directives à StdAfx.h avant d'inclure atlbase.h :
          #include <afxwin.h>   // MFC core and standard components
          #include <afxext.h>   // MFC extensions
          #include <afxdisp.h>  // MFC Automation extensions
    					
  2. Changer les paramètres de projet pour utiliser les MFC. Dans la boîte de dialogue Paramètres du projet, cliquez sur l'onglet Général et modifiez le paramètre dans la zone de liste «Microsoft Foundation Classes» aux MFC.
  3. Ajouter une classe dérivée CWinApp et déclarez une variable globale de ce type comme suit :
    class CMyApp : public CWinApp
          {
          public:
             virtual BOOL InitInstance();
             virtual int ExitInstance();
          protected:
          BOOL m_bRun;
    };
    					
  4. Remplacez la fonction _tWinMain par le code InitInstance et ExitInstance suivant :
    BOOL CMyApp::InitInstance()
    {
    	// Initialize OLE libraries.
    	if (!AfxOleInit())
    	{
    		AfxMessageBox(_T("OLE Initialization Failed!"));
    		return FALSE;
    	}
    
    	// Initialize CcomModule.
    	_Module.Init(ObjectMap, m_hInstance);
    	_Module.dwThreadID = GetCurrentThreadId();
    
    	// Check command line arguments.
    	TCHAR szTokens[] = _T("-/");
    	m_bRun = TRUE;
    	LPCTSTR lpszToken = FindOneOf(m_lpCmdLine, szTokens);
    	while (lpszToken != NULL)
    	{
    		// Register ATL and MFC class factories.
    		if (lstrcmpi(lpszToken, _T("Embedding"))==0 ||
    		lstrcmpi(lpszToken, _T("Automation"))==0)
    		{
    			AfxOleSetUserCtrl(FALSE);
    			break;
    		}
    	// Unregister servers.
    	// There is no unregistration code for MFC
    	// servers. Refer to <WWLINK TYPE="ARTICLE" VALUE="Q186212">Q186212</WWLINK> "How To  Unregister MFC
    	// Automation Servers" for adding unregistration
    	// code.
    		else if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
    		{
    			VERIFY(SUCCEEDED(_Module.UpdateRegistryFromResource(IDR_ServerS2B, FALSE)));
    //Replace  IDR_ServerS2B with your project specific resource ID for the registry script resource
    			VERIFY(SUCCEEDED(_Module.UnregisterServer(TRUE)));
    			m_bRun = FALSE;
    			break;
    		}
    	// Register ATL and MFC objects in the registry.
    		else if (lstrcmpi(lpszToken, _T("RegServer"))==0)
    		{
    			VERIFY(SUCCEEDED(_Module.UpdateRegistryFromResource(IDR_ServerS2B, TRUE)));
    			VERIFY(SUCCEEDED(_Module.RegisterServer(TRUE)));
    			COleObjectFactory::UpdateRegistryAll();
    			m_bRun = FALSE;
    			break;
    		}
    		lpszToken = FindOneOf(lpszToken, szTokens);
    	}
    	if (m_bRun)
    	{
    		// Comment out the next line if not using VC 6-generated
    		// code.
    		_Module.StartMonitor();
    
    		VERIFY(SUCCEEDED(_Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE)));
    		VERIFY(COleObjectFactory::RegisterAll());
    		// To run the EXE standalone, you need to create a window
    		// and assign the CWnd* to m_pMainWnd.
    		LPCTSTR szClass = AfxRegisterWndClass(NULL);
    		m_pMainWnd = new CWnd;
    		m_pMainWnd->CreateEx(0, szClass, _T("SomeName"), 0, CRect(0, 0, 0, 0), NULL, 1234);
    	}
    	return TRUE;
    }
    
    int CMyApp::ExitInstance()
    {
    	// MFC's class factories registration is
    	// automatically revoked by MFC itself.
    	if (m_bRun)
    	{
    		_Module.RevokeClassObjects();
            Sleep(dwPause); //wait for any threads to finish
        }
    
        _Module.Term();
    	return 0;
    }
    					
  5. Pour les générations de Unicode, assurez-vous que le point d'entrée est défini à wWinMainCRTStartup dans la catégorie de sortie du champ de lien dans la boîte de dialogue Paramètres du projet. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
    125750  (http://support.microsoft.com/kb/125750/ ) Vous recevez un message d'erreur «symbole externe non résolu _WinMain@16» lorsque vous essayez de créer une application MFC avec prise en charge Unicode dans Visual C++
  6. Ajouter la ligne de code suivante au début de chaque fonction membre d'une interface COM, procédure de fenêtre et fonction exportée :
    AFX_MANAGE_STATE(AfxGetAppModuleState());
    						
    pour plus d'informations sur la macro AFX_MANAGE_STATE, consultez la documentation en ligne VC ++.
Pour plus d'informations sur l'ajout de prise en charge MFC à un projet ATL COM AppWizard, consultez l'article suivant dans la base de connaissances Microsoft :
181505  (http://support.microsoft.com/kb/181505/EN-US/ ) PRB : ATL COM AppWizard n'offre une prise en charge MFC des .exe

Ajout de la prise en charge MFC à un projet DLL ATL

Suivez les étapes 1 à 3 ci-dessus.

  1. Déplacez le code dans la DllMain générée par AppWizard DLL_PROCESS_ATTACH et DLL_PROCESS_DETACH le CMyApp InitInstance et ExitInstance de l'et supprimer la fonction DllMain comme suit :
          BOOL CMyApp::InitInstance()
          {
             _Module.Init(ObjectMap, m_hInstance);
             return CWinApp::InitInstance();
          }
    
     int CMyApp::ExitInstance()
    {
        // MFC's class factories registration is
        // automatically revoked by MFC itself.
        if (m_bRun)
            _Module.RevokeClassObjects();
    
    
    					
  2. Ajouter la ligne de code suivante au début de chaque fonction membre d'une interface COM, procédure de fenêtre et fonction exportée :
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    						
    Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
    140850  (http://support.microsoft.com/kb/140850/ ) Comment exporter correctement des fonctions en utilisant la bibliothèque partagée de MFC
Remarque : Pour toutes les versions release, assurez-vous que la définition du préprocesseur _ATL_MIN_CRT a été supprimée. Vous pouvez trouver ces définitions dans la catégorie de préprocesseur de l'onglet C/C++ dans la boîte de dialogue Paramètres du projet.

Lorsque project de classe à l'aide de ClassWizard pour un EXE ATL Ajout d'une classe dérivée d'une MFC ou à un projet ATL DLL sans «Prise en charge MFC», le compilateur émet une erreur C2504.

Références

Exemple MFCATL inclus avec Visual C++ 5.0.

Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
186212  (http://support.microsoft.com/kb/186212/ ) Comment faire pour annuler l'inscription des serveurs d'automation MFC
(c) 1997 Microsoft Corporation, tous droits réservés. Contribution de Chuck Bell, Microsoft Corporation.


Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft ActiveX Template Library 3.0 sur le système suivant
    • Microsoft Visual C++ 5.0 Édition Entreprise
    • Microsoft Visual C++ 6.0 Édition Entreprise
    • Microsoft Visual C++ 5.0 Édition Professionnelle
    • Microsoft Visual C++ 6.0 Édition Professionnelle
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft ActiveX Template Library 2.0 sur le système suivant
    • Microsoft Visual C++ 5.0 Édition Entreprise
    • Microsoft Visual C++ 6.0 Édition Entreprise
    • Microsoft Visual C++ 5.0 Édition Professionnelle
    • Microsoft Visual C++ 6.0 Édition Professionnelle
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft ActiveX Template Library 2.1 sur le système suivant
    • Microsoft Visual C++ 5.0 Édition Entreprise
    • Microsoft Visual C++ 6.0 Édition Entreprise
    • Microsoft Visual C++ 5.0 Édition Professionnelle
    • Microsoft Visual C++ 6.0 Édition Professionnelle
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
Mots-clés : 
kbmt kbinfo kbhowto KB173974 KbMtfr
Traduction automatiqueTraduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 173974  (http://support.microsoft.com/kb/173974/en-us/ )
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.