【正文】
COM開發(fā) 潘愛民 20201115 內(nèi)容 ? Win32 SDK和 MFC介紹 ? MFC對 COM的支持 ?用 MFC開發(fā) COM組件 ? ATL對 COM的支持 ?用 ATL開發(fā) COM組件 ?布置作業(yè) Win32 SDK: Windows程序結(jié)構(gòu) ?入口函數(shù) WinMain ?應(yīng)用初始化 ?主窗口的創(chuàng)建及顯示 ?消息分發(fā)循環(huán) ?程序結(jié)束處理 Win32 SDK對 COM的支持 ? Win32 SDK包括 COM庫函數(shù)的支持 W in 3 2 S DK 提供的一些頭文件的說明頭文件 說明Un k n w n .h 標(biāo)準(zhǔn)接口 IUn k n o w n 和 IClas sF a c to ry 的 IID 及接口成員函數(shù)的定義。W t y p e 包含了 COM 使用的數(shù)據(jù)結(jié)構(gòu)的說明。Ob ji d l .h所有標(biāo)準(zhǔn)接口的定義,既可用于 C 語言風(fēng)格的定義,也可用于 C++ 語言風(fēng)格的定義。Co m d e f .h 所有標(biāo)準(zhǔn)接口以及 COM 和 OL E 內(nèi)部對象的 CL S ID 。Ob jBas e .h 所有的 COM A P I 函數(shù)的說明。Ole 2 .h 所有經(jīng)過封裝的 OL E 輔助函數(shù)。利用宏描述接口 DECLARE_INTERFACE_(IClassFactory, IUnknown) { STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE。 STDMETHOD_(ULONG,AddRef) (THIS) PURE。 STDMETHOD_(ULONG,Release) (THIS) PURE。 STDMETHOD(CreateInstance) (THIS_ LPUNKNOWN pUnkOuter, REFIID riid, LPVOID FAR* ppvObject) PURE。 STDMETHOD(LockServer)(THIS_ BOOL fLock) PURE。 }。 VC提供的用于描述接口的宏 與 COM 接口有關(guān)的一些宏的說明宏 說明DECLA RE_ INT ERF A CE ( i f a c e ) 聲明接口 if a c e ,它不從其它的接口派生。DECLA RE_ INT ERF A CE _( i fac e , b a se i f a c e ) 聲明接口 if a c e ,它從接口 b a se ifac e 派生。S T DM ET HO D ( m e th o d ) 聲明接口成員函數(shù) m e th o d ,函數(shù)返回類型為 HRES UL T 。S T DM ET HO D_ (t y p e , m e th o d ) 聲明接口成員函數(shù) m e th o d ,函數(shù)返回類型為 ty p e 。MFC基礎(chǔ) ? 應(yīng)用類 – AfxGetApp – CWinApp::InitInstance – CWinApp::ExitInstance – CWinApp::OnIdle – CWinApp::Run – CWnd *m_pMainWnd ? 窗口類 – AfxGetMainWnd MFC的消息處理機(jī)制 ——消息映射表 ?在 CWnd派生類定義中加入聲明: DECLARE_MESSAGE_MAP() ?在類的實(shí)現(xiàn)文件中加入表和表項(xiàng)的定義: BEGIN_MESSAGE_MAP(theClass, baseClass) ...... END_MESSAGE_MAP 消息映射表示例 BEGIN_MESSAGE_MAP(theClass, baseClass) //{{AFX_MSG_MAP(theClass) ON_WM_SETFOCUS() ON_WM_CREATE() ON_WM_DESTROY() ON_WM_CLOSE() ON_WM_SIZE() ON_MESSAGE(WM_COMMANDHELP, OnCommandHelp) ON_MESSAGE(WM_HELPHITTEST, OnHelpHitTest) ON_UPDATE_COMMAND_UI(ID_VIEW_STATUS_BAR, OnUpdateControlBarMenu) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText) //}}AFX_MSG_MAP END_MESSAGE_MAP MFC應(yīng)用類型 ? 常規(guī)應(yīng)用: MDI應(yīng)用、 SDI應(yīng)用、基于對話框程序 ? DLL應(yīng)用:靜態(tài)連接 MFC庫的正規(guī) DLL、動(dòng)態(tài)連接 MFC庫的正規(guī) DLL、 MFC擴(kuò)展 DLL ? 其他應(yīng)用: – 支持 OLE服務(wù)或者包容器的 SDI應(yīng)用 – 支持 OLE服務(wù)或者包容器的 MDI應(yīng)用 – 支持自動(dòng)化 (Automation)服務(wù)的 SDI或者 MDI程序 – ActiveX控制應(yīng)用 (OCX應(yīng)用 ) MFC庫結(jié)構(gòu) COb jectCCm d T ar g etCW n d應(yīng)用類結(jié)構(gòu)窗口支持異常類 文件服務(wù)類文檔類框架窗口類控制條類屬性頁表類對話框類 視類 控制類圖形設(shè)備環(huán)境類控制支持類W in d o w s 套接字類圖形對象類菜單類ODBC 支持類DA O 支持類同步類其它類:In tern et 支持類自動(dòng)化類型運(yùn)行時(shí)刻對象支持簡單值類型結(jié)構(gòu)其它支持類集合模板類用于同步的類數(shù)組類列表類映射類In tern et 類MFC對 COM應(yīng)用的支持 用嵌套類實(shí)現(xiàn) COM接口 class CDictionary { …… //構(gòu)造函數(shù)和析構(gòu)函數(shù) HRESULT __stdcall QueryInterface(REFIID iid, void** ppvObj)。 ULONG __stdcall AddRef()。 ULONG __stdcall Release()。 class XDictionaryObj : public IDictionary { public: CDictionary * m_pParent。 virtual HRESULT __stdcall QueryInterface(REFIID iid, void** ppvObj)。 virtual ULONG __stdcall AddRef()。 virtual ULONG __stdcall Release()。 virtual BOOL __stdcall Initialize()。 … ... virtual void __stdcall FreeLibrary()。 } m_dictionaryObj。 未完 用嵌套類實(shí)現(xiàn) COM接口 (續(xù)一 ) class XSpellCheckObj : public ISpellCheck { public: CDictionary * m_pParent。 virtual HRESULT __stdcall QueryInterface(REFIID iid, void** ppvObj)。 virtual ULONG __stdcall AddRef()。 virtual ULONG __stdcall Release()。 virtual BOOL __stdcall CheckWord (String word, String *)。 } m_spellCheckObj。 private : struct DictWord *m_pData。 char *m_DictFilename[128]。 int m_Ref 。 int m_nWordNumber, m_nStructNumber。 }。 續(xù) 用嵌套類實(shí)現(xiàn) COM接口 (續(xù)二 ) CDictionary::CDictionary() { ....... // Initializtion m_dictionaryObj. m_pParent = this。 m_spellCheckObj. m_pParent = this。 } 用嵌套類實(shí)現(xiàn) COM接口 (續(xù)三 ) HRESULT CDictionary::QueryInterface(const IIDamp。 iid, void **ppvObj) { if (iid == IID_IUnknown || iid == IID_Dictionary) { *ppvObj = amp。m_dictionaryObj。 AddRef()。 return S_OK。 } else if (iid == IID_SpellCheck) { *ppvObj = amp。m_spellCheckObj。 AddRef()。 return S_OK。 } *ppv = NULL。 return E_NOINTERFACE 。 } 用嵌套類實(shí)現(xiàn) COM接口 (續(xù)四 ) ULONG CDictionary::XDictionaryObj::QueryInterface(const IIDamp。 iid, void **ppvObj) { return m_pParentQueryInterface(iid, ppvObj)。 } ULONG CDictionary::XDictionar