MFCATL 範例:在 MFC 伺服程式中使用 ATL COM 物件
更新:2007 年 11 月
MFCATL 範例說明如何在 MFC 伺服程式 EXE 中使用 ATL COM 物件。
此伺服程式可以讓您建立兩個物件:ObjectOne (在 MFC 中實作並支援分配介面) 和 ObjectTwo (在 ATL 中實作並支援雙重介面)。
安全性注意事項: |
---|
這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。 |
若要取得範例和指示以便進行安裝:
按一下 Visual Studio [說明] 功能表上的 [範例]。
如需詳細資訊,請參閱尋找範例檔案。
最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。
您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於所有的 Visual Studio Express 版,所有範例都可在線上找到。
建置和執行範例
若要建置和執行範例
開啟方案檔 mfcatl.sln。
在 [建置] 功能表中,按一下 [建置方案]。
從 [偵錯]功能表中,按一下 [啟動但不偵錯]。這將會獨立執行 mfcatl.exe 伺服程式,並將加以登錄。
在 Web 瀏覽器中開啟 mfcatl.htm 檔,然後按一下按鈕來呼叫適當的物件。您可以個別呼叫每一個物件,或同時呼叫兩個物件。
轉換備註
這兩個 MFCATL 物件一開始都是在 MFC 中實作,而且都衍生自 CCmdTarget。ObjectTwo 是藉由遵循下列步驟使用 ATL 而重新實作:
將 ATL 標頭檔 (Atlbase.h 和 Atlcom.h) 併入 Premfcat.h 中。
將 Atlimpl.cpp 併入 Premfcat.cpp 中。
將 CComModule 衍生類別加入至 Prefcat.h (類似 BEEPER EXE 範例)。衍生的類別會藉由呼叫 AfxOleLockApp 和 AfxOleUnlockApp 來實作 Lock 和 Unlock 方法,以將鎖定計數轉寄給 MFC。
在 Mfcatl.cpp 中加入物件對應巨集組 (BEGIN_OBJECT_MAP/END_OBJECT_MAP),並加入稱為 _Module 之模組類別的靜態執行個體。
從 InitInstance 和 ExitInstance 呼叫 _Module.Init 和 Term。
加入 typelib 做為資源。
從 InitInstance 呼叫 _Module.RegisterServer(TRUE) 以符合對 COleObjectFactory::UpdateRegistryAll 的 MFC 呼叫。
呼叫 _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE) 以符合 MFC 之類別因數的 REGCLS_MULTIPLEUSE (由 IMPLEMENT_OLECREATE 巨集所隱含完成)。
遵循下列步驟,在 ATL 中重新實作 ObjectTwo:
將 ODL 檔從分配介面變更為雙重介面。
讓 ODL 編譯產生 ATL 所需的標頭檔 (Interf.h)。
重新寫入 .h 和 .cpp 檔 (最快的方法是執行 ATL 精靈,並複製、貼上及重新命名自動產生的程式碼來取代原始的 MFC 程式碼)。
將 OBJECT_ENTRY(CLSID_ObjectTwo, CObjectTwo) 加入至 ATL 物件對應。
其他的轉換步驟 (此處未含蓋) 可能包括:
將 ODL 檔轉換成 IDL 格式。
加入 -RegServer 和 -UnregServer 命令列引數的支援。
關鍵字
本範例使用下列關鍵字:
AfxMessageBox; AfxOleInit; AfxOleLockApp; AfxOleUnlockApp; ASSERT; BEGIN_COM_MAP; CCmdTarget; CCmdTarget::OnFinalRelease; CComCoClass; CComModule; CComModule::GetLockCount; CComModule::Lock; CComModule::Unlock; CComObjectRoot; CDialog; CMenu::AppendMenu; COleObjectFactory::RegisterAll; COleObjectFactory::UpdateRegistryAll; COM_INTERFACE_ENTRY; CString::IsEmpty; CString::LoadString; CWindow::GetSystemMenu; DECLARE_DYNCREATE; DECLARE_NOT_AGGREGATABLE; DECLARE_REGISTRY; DestroyWindow; EnableAutomation; GetClientRect; GetSystemMetrics; IDispatchImpl; PostMessage; SendMessage; SetIcon; ShowWindow; SysAllocString