ATLTangram 属性示例:演示如何管理使用 ATL、MFC 和 COM 的大型项目

更新:2007 年 11 月

ATLTangram 是 Tangram 示例的一种应用,后者位于 Dale Rogerson 的“Inside COM”(COM 探秘)(https://www.microsoft.com/mspress/china/default.htm) 的最后一章。多亏 Dale 付出的努力,使我们可以在 ATL 示例中使用这些代码。此示例将帮助您将旧式 COM 应用程序转换为使用 ATL 作为基础结构的应用程序。

ATLTangram 是包含 ATLTangram 解决方案的大型项目,ATLTangram 解决方案是六个子项目(MFCTangram、ATLModel、ATLGdiWorld、ATLGLWorld、ATLModelExe 和 ATLTangramCanvas)的主控制器。此示例说明集成开发环境 (IDE) 的若干功能和几个 COM 概念。此示例还说明如何将 MFC 用作 ATL COM 服务器的客户端。

安全说明:

提供该示例代码是为了阐释一个概念,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,Microsoft 不承担任何责任。

获取示例和安装示例的说明:

  • 在 Visual Studio 的“帮助”菜单上,单击“示例”。

    有关更多信息,请参见定位示例文件

  • 示例的最新版本和完整列表可以从 Visual Studio 2008 Samples page(Visual Studio 2008 示例页面)联机获取。

  • 还可以在计算机的硬盘上查找示例。默认情况下,示例和自述文件将复制到 \Program Files\Visual Studio 9.0\Samples\ 下的文件夹中。对于 Visual Studio 速成版,所有示例都位于联机位置。

生成并运行示例

生成并运行此示例

  1. 打开解决方案文件 atltangram.sln。

  2. 在“生成”菜单中,单击“生成解决方案”。

  3. 在“调试”菜单中,单击“开始执行(不调试)”。

  4. 将出现一个对话框:请选择任一选项。Tangram 程序将开始运行。

管理大型项目

解决方案已在 IDE 中建立了相互依赖项。这些相互依赖项使用示例的默认目录结构并且与路径相关。

依赖项层次结构大致如下:

MFCTangram
   ATLGLWorld
      ATLGdiWorld
         ATLTangramCanvas
            ATLModel
   ATLModelExe
      ATLModel
      ATLModel

已为该示例建立了所有项目设置。按下列步骤检查项目相互依赖项。

  1. 从“项目”菜单中单击“属性”。

  2. 在解决方案资源管理器中选择 Atltangram 解决方案。

  3. 在“属性页”对话框中,展开“通用属性”文件夹,然后选择“调试源文件”。查看“在这些路径中搜索源文件”框。

  4. 单击“项目依赖项”并检查依赖项目名称。

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++ 向导、库和编译器中所做的更改,但仍演示了如何完成所需的任务。

请参见

其他资源

ATL 属性示例