ID do artigo: 173974 - Última revisão: quinta-feira, 2 de junho de 2005 - Revisão: 3.0

Como adicionar suporte a MFC a um projeto ATL no Visual C++

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Recolher tudo

Sumário

Ao criar um projeto ATL EXE usando o AppWizard, a caixa de seleção de suporte do MFC está desabilitada. Este artigo explica como adicionar suporte a MFC para um projeto ATL EXE. Este artigo também explica como adicionar suporte a MFC para um projeto ATL DLL se você Falha ao selecionar a caixa de seleção "suporte MFC" inicialmente no AppWizard.

Mais Informações

Adicionando suporte a MFC a um projeto EXE do ATL

  1. Adicione o seguinte # include diretivas para StdAfx.h antes para incluindo atlbase.h:
          #include <afxwin.h>   // MFC core and standard components
          #include <afxext.h>   // MFC extensions
          #include <afxdisp.h>  // MFC Automation extensions
    					
  2. Alterar configurações de projeto para usar MFC. Da caixa de diálogo Configurações do projeto , clique na guia Geral e altere a configuração na caixa de listagem " Microsoft Foundation Classes " ao MFC.
  3. Adicionar uma classe derivada de CWinApp e declarar uma variável global desse tipo da seguinte maneira:
    class CMyApp : public CWinApp
          {
          public:
             virtual BOOL InitInstance();
             virtual int ExitInstance();
          protected:
          BOOL m_bRun;
    };
    					
  4. Substituir a função _tWinMain com o seguinte código CWinAppEx e ExitInstance:
    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. Para Unicode cria, verifique se que o ponto de entrada está definido para wWinMainCRTStartup na categoria de saída do campo link na caixa de diálogo Configurações de projeto . Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
    125750  (http://support.microsoft.com/kb/125750/ ) Você receber uma mensagem de erro "_WinMain@16 símbolo externo não resolvidos" ao tentar criar um aplicativo do MFC com suporte a Unicode no Visual C++
  6. Adicione a linha de código a seguir ao início de cada função de membro de uma interface COM, o procedimento de janela e função exportada:
    AFX_MANAGE_STATE(AfxGetAppModuleState());
    						
    para obter mais informações sobre AFX_MANAGE_STATE, consulte a documentação on-line do VC ++.
Para obter mais informações sobre como adicionar suporte a MFC para um projeto ATL COM AppWizard, consulte o seguinte artigo na Base de dados de Conhecimento da Microsoft:
181505  (http://support.microsoft.com/kb/181505/EN-US/ ) PROBLEMA: ATL COM AppWizard não oferecer suporte a MFC .exe

Adicionando suporte a MFC a um projeto DLL do ATL

Siga as etapas 1 a 3 acima.

  1. Mova o código no DllMain gerado pelo AppWizard DLL_PROCESS_ATTACH e DLL_PROCESS_DETACH o CMyApp CWinAppEx e ExitInstance e remova o DllMain da seguinte maneira:
          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. Adicione a linha de código a seguir ao início de cada função de membro de uma interface COM, o procedimento de janela e função exportada:
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    						
    Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
    140850  (http://support.microsoft.com/kb/140850/ ) Como exportar funções corretamente usando a biblioteca compartilhada do MFC
Observação: Para todas as compilações de versão, certifique-se que a definição de pré-processamento _ATL_MIN_CRT tiver sido removida. Você encontrará essas definições na categoria pré-processador da guia C/C ++ na caixa de diálogo Configurações do projeto .

Quando adicionar uma classe derivada de um MFC classe usando o ClassWizard para um projeto ATL EXE ou para um projeto ATL DLL sem "MFC Support", o compilador emitirá um erro C2504.

Referências

Exemplo de MFCATL incluídos no Visual C++ 5.0.

Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
186212  (http://support.microsoft.com/kb/186212/ ) Como cancelar o registro de servidores de automação do MFC
(c) 1997 Microsoft Corporation, todos os direitos reservados. Contribuições de Chuck Bell, Microsoft Corporation.


A informação contida neste artigo aplica-se a:
  • Microsoft ActiveX Template Library 3.0 nas seguintes plataformas
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft ActiveX Template Library 2.0 nas seguintes plataformas
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft ActiveX Template Library 2.1 nas seguintes plataformas
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
Palavras-chave: 
kbmt kbinfo kbhowto KB173974 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 173974  (http://support.microsoft.com/kb/173974/en-us/ )