ATLTangram 특성 샘플: ATL, MFC 및 COM을 사용하는 대규모 프로젝트 관리

업데이트: 2007년 11월

ATLTangram은 Dale Rogerson이 지은 "Inside COM"(https://www.microsoft.com/mspress/korea)의 마지막 장에 있는 Tangram 예제의 일부입니다. 그 어려운 작업을 모두 해내고 ATL 샘플에 코드를 사용하도록 허락해 준 Dale에게 깊은 감사의 뜻을 표합니다. 이 샘플을 사용하면 레거시 COM 응용 프로그램을 변환하여 ATL을 인프라로 사용하는 응용 프로그램을 만들 수 있습니다.

ATLTangram은 MFCTangram, ATLModel, ATLGdiWorld, ATLGLWorld, ATLModelExe 및 ATLTangramCanvas 등의 6개 하위 프로젝트에 대한 마스터 컨트롤러인 ATLTangram 솔루션으로 구성된 대규모 프로젝트입니다. 이 샘플은 IDE(통합 개발 환경)의 여러 기능과 COM의 여러 개념을 보여 줍니다. 또한 MFC를 ATL COM 서버의 클라이언트로 사용하는 방법도 보여 줍니다.

보안 정보:

이 샘플 코드는 개념을 보여 주기 위해 제공되며 가장 안전한 코드 작성 방법을 제시하지 않을 수 있으므로 응용 프로그램이나 웹 사이트에서 사용할 수 없습니다. Microsoft는 샘플 코드를 원래 용도 이외의 다른 용도로 사용하는 경우 발생하는 부수적이나 파생적인 손해에 대해 책임을 지지 않습니다.

샘플 및 이를 설치하기 위한 지침을 가져오려면

  • Visual Studio의 도움말 메뉴에서 샘플을 클릭합니다.

    자세한 내용은 샘플 파일 찾기를 참조하십시오.

  • 최신 버전 및 전체 샘플 목록은 Visual Studio 2008 Samples 페이지에서 온라인으로 사용할 수 있습니다.

  • 컴퓨터의 하드 디스크에서도 샘플을 찾을 수 있습니다. 기본적으로 샘플과 추가 정보 파일은 \Program Files\Visual Studio 9.0\Samples\ 아래의 폴더에 복사됩니다. Visual Studio Express Edition의 경우에는 모든 샘플이 온라인에 있습니다.

샘플 빌드 및 실행

이 샘플을 빌드하고 실행하려면

  1. atltangram.sln 솔루션 파일을 엽니다.

  2. 빌드 메뉴에서 솔루션 빌드를 클릭합니다.

  3. 디버그 메뉴에서 디버깅하지 않고 시작을 클릭합니다.

  4. 대화 상자가 나타나면 옵션을 선택합니다. Tangram 프로그램이 시작됩니다.

대규모 프로젝트 관리

이 솔루션은 IDE에서 상호 종속성을 설정합니다. 이 상호 종속성은 샘플의 기본 디렉터리 구조와 일치하며 경로에 대해 상대적입니다.

종속성 계층 구조는 다음과 유사합니다.

MFCTangram
   ATLGLWorld
      ATLGdiWorld
         ATLTangramCanvas
            ATLModel
   ATLModelExe
      ATLModel
      ATLModel

이 샘플의 모든 프로젝트는 이미 설정되어 있습니다. 다음 단계에 따라 프로젝트 상호 종속성을 검사합니다.

  1. 프로젝트 메뉴에서 속성을 클릭합니다.

  2. 솔루션 탐색기에서 Atltangram 솔루션을 선택합니다.

  3. 속성 페이지 대화 상자에서 공용 속성 폴더를 확장한 다음 소스 파일 디버그를 선택합니다. 다음 경로에서 소스 파일 검색 상자를 검토합니다.

  4. 프로젝트 종속성을 클릭한 다음 종속 프로젝트 이름을 검토합니다.

ATLModel 및 ATLModelExe 프로젝트에서는 여러 개의 같은 파일과 두 개의 프로젝트 파일을 사용하여 COM 서버를 in-process 또는 로컬 서버 중 하나로 빌드할 수 있도록 COM서버를 설정하는 방법을 보여 줍니다. 두 개의 프로젝트 파일을 사용하면 DLL과 EXE 에 모두 종속성이 있게 됩니다.

COM/ATL 기능

이 샘플은 여러 개의 COM 서버와 이 서버들을 사용하는 하나의 MFC 응용 프로그램으로 구성된 COM 시스템입니다. 이 샘플은 연결 지점 메커니즘을 통한 모듈 간 통신을 나타내며 로컬 서버와 in-process 서버를 보여 줍니다.

샘플에 포함된 기타 기능

  • ATL 서버는 컬렉션에 대해 표준 템플릿 라이브러리를 사용합니다.

  • MFC 드라이버는 MFC 템플릿 클래스를 사용합니다.

  • 문서/뷰가 없는 응용 프로그램의 예인 MFC 드라이버는 CFrameWnd에서 파생된 클래스를 Tangram 요소를 그리기 위한 출력 창으로 사용합니다.

특성

이 샘플에서는 다음의 특성을 사용합니다.

  • ATLTANGRAM   export, helpstring, object, pointer_default, uuid

  • ATLTANGRAM/atlgdiworld   coclass, com_interface_entry, default, dll, event_receiver, helpstring, iid_is, implements_category, in, module, name, object, out, pointer_default, progid, registration_script, size_is, unique, uuid, version, vi_progid

  • ATLTANGRAM/atlglworld   coclass, com_interface_entry, default, dll, event_receiver, helpstring, implements_category, in, module, name, object, out, pointer_default, progid, registration_script, uuid, vi_progid

  • ATLTANGRAM/atlmodel   coclass, default, dll, event_source, exe, helpstring, in, module, name, object, out, pointer_default, progid, size_is, uuid

  • ATLTANGRAM/atltangramcanvas   coclass, default, dll, helpstring, in, module, name, object, out, pointer_default, progid, registration_script, uuid, vi_progid

클래스 및 키워드

이 샘플에서는 다음의 ATL 클래스를 사용합니다.

CComObjectRootEx, CComCoClass, CComControl, IDispatchImpl, IProvideClassInfo2Impl, IPersistStreamInitImpl, IPersistStorageImpl, IPersistPropertyBagImpl, IPerPropertyBrowsingImpl, IQuickActivateImpl, IObjectSafetyImpl, IOleControlImpl, IOleObjectImpl, IOleInPlaceActiveObjectImpl, IViewObjectExImpl, IOleInPlaceObjectWindowlessImpl, IDataObjectImpl, ISupportErrorInfo, ISpecifyPropertyPagesImpl, IConnectionPointContainerImpl, IPropertyNotifySinkCP, CDialogImpl

이 샘플에서는 다음의 MFC 클래스를 사용합니다.

CFrameWnd, CTypedPtrList<>, CDialog, CWinApp 및 추가 지원 클래스

이 샘플에서는 다음의 키워드를 사용합니다.

_ASSERTE; AddRef; AddUpdateRect; Advise; assert; ASSERT; ATLTRACE; auxSolidSphere; BEGIN_COM_MAP; BEGIN_CONNECTION_POINT_MAP; BEGIN_MESSAGE_MAP; BEGIN_OBJECT_MAP; BitBlt; CATEGORYINFO ; CComCoClass; CComModule::GetClassObject; CComModule::GetLockCount; CComModule::Init; CComModule::RegisterServer; CComModule::Term; CComModule::UnregisterServer; CComObjectRootEx; CExeModule::Init; CExeModule::RegisterClassObjects; CExeModule::RegisterServer; CExeModule::RevokeClassObjects; CExeModule::UnregisterServer; CExeModule::UpdateRegistryFromResource; CFrameWnd::AssertValid; CFrameWnd::Dump; CFrameWnd::PreCreateWindow; ChoosePixelFormat; CModelList; CoCreateInstance; CoInitializeEx; COM_INTERFACE_ENTRY; COM_INTERFACE_ENTRY_AGGREGATE; COM_INTERFACE_ENTRY_IMPL; CONNECTION_POINT_ENTRY; CopyRect; CoTaskMemFree; CProxyIATLTangramModelEvent; CreateCompatibleDC; CreatePalette; CWnd::CreateEx; DECLARE_GET_CONTROLLING_UNKNOWN; DECLARE_MESSAGE_MAP; DECLARE_ONLY_AGGREGATABLE; DECLARE_REGISTRY_RESOURCEID; DeleteObject; DescribePixelFormat; DisableThreadLibraryCalls; DispatchMessage; DoButtonDown; DoModal; END_COM_MAP; END_CONNECTION_POINT_MAP; END_MESSAGE_MAP; END_OBJECT_MAP; EqualRect; ErrorMessage; GdiFlush; GetBoundingRect; GetClientRect; GetCommandLine; GetControllingUnknown; GetDC; GetMessage; GetModuleFileName; GetObject; GetPalette; GetPaletteEntries; GetPixelFormat; GetRotation; GetVertices; glBegin; glClearColor; GLdouble CoCreateInstance; glEnable; glEnd; glFlush; glGetIntegerv; glInitNames; glLightfv; glLightModelfv; glLoadIdentity; glMatrixMode; glNormal3d; glPolygonMode; glPopMatrix; glPopName; glPushMatrix; glPushName; GLRender; glRenderMode; GLResize; glRotated; glSelectBuffer; GLSetup; glTranslated; glTranslatef; gluPerspective; gluPickMatrix; gluUnProject; glVertex2d; glVertex3d; glViewport; HPALETTE; ICatInformation::EnumClassesOfCategories; ICatRegister::QueryInterface; ICatRegister::RegisterCategories; ICatRegister::RegisterClassImplCategories; ICatRegister::UnRegisterCategories; ICatRegister::UnRegisterClassImplCategories; IConnectionPointContainer::FindConnectionPoint; IConnectionPointContainer::Release; IConnectionPointContainerImpl; InitInstance; InvalidateRect; IsCurrent; IsValidAddress; IUnknown::Release; LoadIcon; LoadStandardCursor; LocalFree; MakeCurrent; OBJECT_ENTRY; ON_COMMAND; ON_WM_DESTROY ; OnCancel; OnDestroy; OnInitDialog; OnOK; OnQueryNewPalette; OutputDebugString; OutputGlError; Polygon; PreCreateWindow; PtInRegion; QueryInterface; RealizePalette; Release; ReleaseConnectionPoint; ReleaseDC; Rotate; SelectObject; SelectPalette; SetPixelFormat; SetRectEmpty; specifyMaterial; StringFromCLSID; SubkeyExists; va_end; wcscpy_s; wglCreateContext; wglGetCurrentContext; wglMakeCurrent

참고:

이 샘플을 비롯한 일부 샘플은 Visual C++ 마법사, 라이브러리 및 컴파일러의 변경 내용을 반영하도록 수정되지 않았지만 해당 작업의 수행 방법을 보여 줍니다.

참고 항목

기타 리소스

ATL 특성 샘플