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 |
덧글