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é.
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.
Ajout de la prise en charge MFC à un projet ATL EXE
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
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.
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;
};
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;
}
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++
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.
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();
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.
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.
Ces informations vous ont-elles aidé ?
Oui
Non
Plutôt
Quel niveau d'effort avez-vous dû personnellement fournir pour utiliser cet article ?
Très faible
Faible
Moyen
Elevé
Très élevé
Dites-nous pourquoi et ce que nous pouvons faire pour améliorer ces informations.
Merci ! Vos commentaires sont très utiles pour l'amélioration de notre contenu d'aide et de support. Si vous avez besoin d'aide complémentaire, veuillez consulter la page d'accueil d'aide et support.