Образец атрибутов ATLTangram: демонстрация управления большими проектами, использующими ATL, MFC и COM
Обновлен: Ноябрь 2007
Образец ATLTangram представляет портированную версию примера Tangram из последней главы книги Дейла Роджерсона (Dale Rogerson) Основы COM (http://mspress.microsoft.com). Выражаем благодарность Дейлу за проделанную работу и разрешение использовать код в образце ATL. Этот образец предназначен для преобразования COM-приложения прежних версий в приложение, в инфраструктуре которого используется ATL.
Образец ATLTangram является крупным проектом, состоящим из решения ATLTangram, которое является главным контроллером для шести подпроектов: MFCTangram, ATLModel, ATLGdiWorld, ATLGLWorld, ATLModelExe и ATLTangramCanvas. В образце показано несколько функций интегрированной среды разработки и несколько основных понятий модели COM. В образце также демонстрируется использование MFC в качестве клиентов COM-серверов ATL.
Примечание о безопасности. |
---|
Этот образец кода служит для демонстрации основных принципов и не предназначен для использования в приложениях или на веб-узлах, поскольку не может считаться примером наиболее безопасного кода. Корпорация Майкрософт не несет ответственности за случайные или косвенные убытки в случае использования образца кода не по назначению. |
Чтобы получить образцы и инструкции по их установке, выполните следующие действия.
В меню Справка среды Visual Studio выберите пункт Примеры.
Дополнительные сведения см. в разделе Поиск файлов примеров.
Самая последняя версия и полный список образцов доступны в Интернете на странице образцов Visual Studio 2008.
Кроме того, образцы находятся на жестком диске компьютера. По умолчанию образцы кода и файл Readme копируются в папку, находящуюся в папке \Program Files\Visual Studio 9.0\Samples\. Все образцы кода для экспресс-выпусков Visual Studio находятся в Интернете.
Построение и запуск образца
Построение и запуск этого образца
Откройте файл решения atltangram.sln.
В меню Построение выберите команду Построить решение.
В меню Отладка выберите команду Запуск без отладки.
Откроется диалоговое окно. Выберите один из вариантов. Запустится программа Tangram.
Управление большим проектом
Решение устанавливает взаимозависимости в интегрированной среде разработки. Эти взаимозависимости работают со структурой каталогов по умолчанию для образца и задаются относительно пути.
Иерархия зависимостей имеет примерно следующий вид:
MFCTangram
ATLGLWorld
ATLGdiWorld
ATLTangramCanvas
ATLModel
ATLModelExe
ATLModel
ATLModel
Для образца уже установлены все параметры проекта. Чтобы просмотреть взаимозависимости проекта, выполните следующие действия.
В меню Проект выберите пункт Свойства.
Выберите решение Atltangram в обозревателе решений.
В диалоговом окне Страницы свойств разверните папку Общие свойства и выберите пункт Исходные файлы отладки. Проверьте значение поля Пути к исходным файлам.
Нажмите кнопку Зависимости проектов и изучите имена зависимых проектов.
Проекты ATLModel и ATLModelExe показывают, как настроить COM-сервер, чтобы его можно было построить как внутрипроцессный сервер или как локальный сервер с использованием одинакового набора файлов и двух файлов проекта. Использование двух файлов проекта делает возможным наличие зависимостей в модулях DLL и EXE.
Функции COM и ATL
Этот образец является COM-системой, состоящей из нескольких COM-серверов и приложения MFC, которое использует эти серверы. В образце представлена межмодульная связь посредством механизма точек подключения и показаны локальные и внутрипроцессные серверы.
Другие демонстрируемые функции
Серверы 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++, однако по-прежнему демонстрируют выполнение требуемой задачи. |