ludin's story

kaludin.egloos.com

포토로그 마이가든



ATL EXE 에서 MFC 사용하기(닷넷 2005) 0

1. 일단 ATL 프로젝트를 하나 생성합니다.

 

2. ATL 프로젝트 마법사에서 다음 그림과 같이 설정하시고 [마침] 버튼을 누릅니다.

 

 

3. ATL 컨트롤을 하나 만들어 주시구요...

 

4. stdafx.h 헤더 파일에 다음 헤더 파일을 인클루드 합니다.

 

#include <afxwin.h>   // MFC core and standard components
#include <afxext.h>   // MFC extensions
#include <afxdisp.h>  // MFC Automation extensions

5. 속성 페이지에서 "MFC 사용 " 을  [표준Windows 라이브러리 사용] -> [공유 DLL 에서 MFC 사용] 으로 설정합니다.

 그리고 확인.

 

 

6. 기존의 COM Module 과 WinMain 을 제거합니다.

 

    CxxxxModule  클래스 선언으로 이동합니다.

 


class CATLEXEModule : public CAtlExeModuleT< CATLEXEModule >
{
public :
 DECLARE_LIBID(LIBID_ATLEXELib)
 DECLARE_REGISTRY_APPID_RESOURCEID(IDR_ATLEXE, "{2FFE4EAD-E7A1-49D6-9D09-B14CE4803B6C}")

};

CATLEXEModule _AtlModule;

 

//
extern "C" int WINAPI _tWinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/,
                                LPTSTR /*lpCmdLine*/, int nShowCmd)
{
    return _AtlModule.WinMain(nShowCmd);
}

 

요렇게 되어 있는 놈을 주석처리해 주시구요....

 

아래처럼 코딩해 주면 됩니다.

 

빨간색 부분은 원래 소스에 있는 내용을 그대로 가져다 쓰는 겁니다.

 

7. 새로운 COM Module 과 CWinApp 를 만들어 줍니다.


class CATLEXEModule : public CAtlMfcModule
{
public:
 DECLARE_LIBID(LIBID_ATLEXELib)
 DECLARE_REGISTRY_APPID_RESOURCEID(IDR_ATLEXE, "{2FFE4EAD-E7A1-49D6-9D09-B14CE4803B6C}")

};

 

CATLEXEModule _AtlModule;

class CATLEXEApp : public CWinApp
{
public:
    virtual BOOL InitInstance();
    virtual int ExitInstance();
#ifdef _DEBUG
 CDialog m_dlg;
#endif};

CATLEXEApp theApp;

BOOL CATLEXEApp::InitInstance()
{
    // Initialize OLE libraries.
    if (!AfxOleInit())
    {
        AfxMessageBox(_T("OLE Initialization Failed!"));
        return FALSE;
    }

    // Parse command line for standard shell commands,
    // DDE, file open
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);
#if !defined(_WIN32_WCE) || defined(_CE_DCOM)
    // Register class factories via CoRegisterClassObject().
    if (FAILED(_AtlModule.RegisterClassObjects(CLSCTX_LOCAL_SERVER,
            /*REGCLS_MULTIPLEUSE*/ REGCLS_SINGLEUSE )))
        return FALSE;
#endif // !defined(_WIN32_WCE) || defined(_CE_DCOM)
    //// App was launched with /Embedding or /Automation switch.
    //// Run app as automation server.
    if (cmdInfo.m_bRunEmbedded || cmdInfo.m_bRunAutomated)
    {
        // Don't show the main window
        return TRUE;
    }
    // App was launched with /Unregserver or /Unregister switch.
    if (cmdInfo.m_nShellCommand == CCommandLineInfo::AppUnregister)
    {
        _AtlModule.UpdateRegistryAppId(FALSE);
        _AtlModule.UnregisterServer(TRUE);
        return FALSE;
    }
    // App was launched with /Register or /Regserver switch.
    if (cmdInfo.m_nShellCommand == CCommandLineInfo::AppRegister)
    {
        _AtlModule.UpdateRegistryAppId(TRUE);
        _AtlModule.RegisterServer(TRUE);
        return FALSE;
    }

#ifdef _DEBUG
 m_dlg.Create(IDD_DIALOG_TEMP,NULL); // 다이얼로그 리소스 ID
 this->m_pMainWnd = &m_dlg;
#endif 
    return TRUE;
}

int CATLEXEApp::ExitInstance()
{
#if !defined(_WIN32_WCE) || defined(_CE_DCOM)
    _AtlModule.RevokeClassObjects();
#endif

#ifdef _DEBUG
 m_dlg.DestroyWindow();
#endif    

 return CWinApp::ExitInstance();
}

 

소스를 요렇게 바꾸어 주면 됩니다.

 

 

 

8. 디버깅을 위해서는 InitInstance 에서 다이얼로그를 하나 보이지 않게 만들어 주면 됩니다.

 

9. 함수에서 AFX_MANAGE_STATE(AfxGetAppModuleState()); 를 사용하시면 끝입니다.

 

이상입니다.

 

 

참고

http://support.microsoft.com/kb/173974








출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=8321&ref=8321



트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://kaludin.egloos.com/tb/2460781 [도움말]

덧글

덧글 입력 영역



:: 배경음악 ::

1. 성시경-추억이 들린다 2. 씨야-사랑의 인사
Candle