共用方式為


ATLTangram 屬性範例:示範管理使用 ATL、MFC 和 COM 的大型專案

更新:2007 年 11 月

ATLTangram 是節錄自 Dale Rogerson 著作《Inside COM》 (https://www.microsoft.com/mspress/taiwan/default.htm) 最後一章中的 Tangram 範例。非常感謝 Dale 投注極大心力在這本著作中,更感謝他願意讓我們在 ATL 範例中使用他書裡的程式碼。這個範例可以幫助您將舊版 COM 應用程式轉換為以 ATL 為基礎結構的應用程式。

ATLTangram 是一個由 ATLTangram 方案所組成的大型專案,它是下列六個子專案的主控制站:MFCTangram、ATLModel、ATLGdiWorld、ATLGLWorld、ATLModelExe 和 ATLTangramCanvas。本範例示範整合式開發環境 (IDE) 的幾個功能及 COM 的幾個概念。本範例還會示範使用 MFC 來當做 ATL COM 伺服器的用戶端。

安全性注意事項:

這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。

若要取得範例和指示以便進行安裝:

  • 按一下 Visual Studio [說明] 功能表上的 [範例]。

    如需詳細資訊,請參閱尋找範例檔案

  • 最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。

  • 您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於所有的 Visual Studio Express 版,所有範例都可在線上找到。

建置和執行範例

若要建置和執行這個範例

  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 Server) 或本機伺服程式。使用兩個專案檔讓相依性存在於 DLL 和 EXE。

COM/ATL 功能

這個範例是一個 COM 系統,包含許多 COM 伺服器和使用伺服器的 MFC 應用程式。範例透過連接點機制進行模組間通訊,並且示範本機和同處理序伺服程式。

其他示範的功能

  • ATL Server 對集合使用標準樣板程式庫。

  • 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 屬性範例