




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、潘愛民2003-11-7http:/ SDK和和MFC介紹介紹lMFC對(duì)對(duì)COM的支持的支持l用用MFC開發(fā)開發(fā)COM組件組件lATL對(duì)對(duì)COM的支持的支持l用用ATL開發(fā)開發(fā)COM組件組件l布置作業(yè)布置作業(yè)l入口函數(shù)入口函數(shù)WinMainl應(yīng)用初始化應(yīng)用初始化l主窗口的創(chuàng)建及顯示主窗口的創(chuàng)建及顯示l消息分發(fā)循環(huán)消息分發(fā)循環(huán)l程序結(jié)束處理程序結(jié)束處理lWin32 SDK包括包括COM庫函數(shù)的支持庫函數(shù)的支持Win32 SDK 提供的一些頭文件的說明頭文件說明Unknwn.h標(biāo)準(zhǔn)接口IUnknown 和IClassFactory的IID 及接口成員函數(shù)的定義。Wtypes.h包含了COM 使用的
2、數(shù)據(jù)結(jié)構(gòu)的說明。Objidl.h所有標(biāo)準(zhǔn)接口的定義, 既可用于C 語言風(fēng)格的定義, 也可用于C+語言風(fēng)格的定義。Comdef.h所有標(biāo)準(zhǔn)接口以及COM 和OLE 內(nèi)部對(duì)象的CLSID。ObjBase.h所有的COM API 函數(shù)的說明。Ole2.h所有經(jīng)過封裝的OLE 輔助函數(shù)。 DECLARE_INTERFACE_(IClassFactory, IUnknown) STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDME
3、THOD_(ULONG,Release) (THIS) PURE; STDMETHOD(CreateInstance) (THIS_ LPUNKNOWN pUnkOuter, REFIID riid, LPVOID FAR* ppvObject) PURE; STDMETHOD(LockServer)(THIS_ BOOL fLock) PURE; ;與 COM 接口有關(guān)的一些宏的說明宏說明DECLARE_INTERFACE(iface)聲明接口 iface,它不從其它的接口派生。DECLARE_INTERFACE_( iface, baseiface)聲明接口 iface,它從接口 base
4、iface 派生。STDMETHOD(method)聲明接口成員函數(shù) method,函數(shù)返回類型為 HRESULT。STDMETHOD_(type,method)聲明接口成員函數(shù) method,函數(shù)返回類型為 type。l應(yīng)用類應(yīng)用類 AfxGetApp CWinApp:InitInstance CWinApp:ExitInstance CWinApp:OnIdle CWinApp:Run CWnd *m_pMainWndl窗口類窗口類 AfxGetMainWndl在在CWnd派生類定義中加入聲明:派生類定義中加入聲明:DECLARE_MESSAGE_MAP()l在類的實(shí)現(xiàn)文件中加入表和表項(xiàng)的
5、定義:在類的實(shí)現(xiàn)文件中加入表和表項(xiàng)的定義:BEGIN_MESSAGE_MAP(theClass, baseClass).END_MESSAGE_MAPBEGIN_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_COM
6、MAND_UI(ID_VIEW_STATUS_BAR, OnUpdateControlBarMenu)ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0 xFFFF, OnToolTipText)/AFX_MSG_MAPEND_MESSAGE_MAPl常規(guī)應(yīng)用:常規(guī)應(yīng)用:MDI應(yīng)用、應(yīng)用、SDI應(yīng)用、基于對(duì)話框應(yīng)用、基于對(duì)話框程序程序lDLL應(yīng)用:靜態(tài)連接應(yīng)用:靜態(tài)連接MFC庫的正規(guī)庫的正規(guī)DLL、動(dòng)態(tài)、動(dòng)態(tài)連接連接MFC庫的正規(guī)庫的正規(guī)DLL、MFC擴(kuò)展擴(kuò)展DLLl其他應(yīng)用:其他應(yīng)用: 支持支持OLE服務(wù)或者包容器的服務(wù)或者包容器的SDI應(yīng)用應(yīng)用 支持支持OLE服務(wù)
7、或者包容器的服務(wù)或者包容器的MDI應(yīng)用應(yīng)用 支持自動(dòng)化支持自動(dòng)化(Automation)服務(wù)的服務(wù)的SDI或者或者M(jìn)DI程序程序 ActiveX控制應(yīng)用控制應(yīng)用(OCX應(yīng)用應(yīng)用)CObjectCCmdTargetCWnd應(yīng)用類結(jié)構(gòu)窗口支持異常類文件服務(wù)類文檔類框架窗口類控制條類屬性頁表類對(duì)話框類視類控制類圖形設(shè)備環(huán)境類控制支持類Windows 套接字類圖形對(duì)象類菜單類ODBC 支持類DAO 支持類同步類其它類:其它類:Internet 支持類自動(dòng)化類型運(yùn)行時(shí)刻對(duì)象支持簡單值類型結(jié)構(gòu)其它支持類集合模板類用于同步的類數(shù)組類列表類映射類Internet 類class CDictionary /構(gòu)造函
8、數(shù)和析構(gòu)函數(shù)構(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(); virt
9、ual ULONG _stdcall Release(); virtual BOOL _stdcall Initialize();.virtual void _stdcall FreeLibrary(); m_dictionaryObj; 未完未完 class XSpellCheckObj : public ISpellCheck public:CDictionary * m_pParent;virtual HRESULT _stdcall QueryInterface(REFIID iid, void* ppvObj);virtual ULONG _stdcall AddRef(); vir
10、tual ULONG _stdcall Release(); virtual BOOL _stdcall CheckWord (String word, String *); m_spellCheckObj;private :structDictWord *m_pData;char*m_DictFilename128;intm_Ref ;intm_nWordNumber, m_nStructNumber;續(xù)續(xù)CDictionary:CDictionary()./ Initializtionm_dictionaryObj. m_pParent = this;m_spellCheckObj. m_
11、pParent = this;HRESULT CDictionary:QueryInterface(const IID& iid, void *ppvObj) if (iid = IID_IUnknown | iid = IID_Dictionary) *ppvObj = &m_dictionaryObj;AddRef();return S_OK; else if (iid = IID_SpellCheck) *ppvObj = &m_spellCheckObj;AddRef();return S_OK;*ppv = NULL;return E_NOINTERFACE
12、;ULONG CDictionary:XDictionaryObj:QueryInterface(const IID& iid, void *ppvObj) return m_pParent-QueryInterface(iid, ppvObj); ULONG CDictionary:XDictionaryObj:AddRef() return m_pParent-AddRef(); ULONG CDictionary:XDictionaryObj:Release () return m_pParent-Release (); m_pDatam_DictFilename128m_Ref
13、 m_nWordNumberm_nStructNumberQueryInterfaceAddRefRelease.m_dictionaryObjm_spellCheckObjQueryInterfaceAddRefReleaseQueryInterfaceAddRefReleaseVtable for IDictionaryVtable for ISpellCheckCDictionaryvptrvptrCDictionary的非虛函數(shù)lCCmdTarget類類lCCmdTarget:m_dwRef為引用計(jì)數(shù)為引用計(jì)數(shù)l接口映射表與消息映射表非常類似接口映射表與消息映射表非常類似l接口映射表:
14、記錄了接口映射表:記錄了CCmdTarget類中類中每一個(gè)嵌套類的接口每一個(gè)嵌套類的接口ID以及接口以及接口vtable與父類與父類this指針之間的偏移量指針之間的偏移量loffsetof宏:成員類與父類之間的偏移值宏:成員類與父類之間的偏移值#define DECLARE_INTERFACE_MAP() private: static const AFX_INTERFACEMAP_ENTRY _interfaceEntries; protected: static AFX_DATA const AFX_INTERFACEMAP interfaceMap; static const AFX_
15、INTERFACEMAP* PASCAL _GetBaseInterfaceMap(); virtual const AFX_INTERFACEMAP* GetInterfaceMap() const; struct AFX_INTERFACEMAP_ENTRYconst void* piid; size_t nOffset; ;struct AFX_INTERFACEMAP#ifdef _AFXDLLconst AFX_INTERFACEMAP* (PASCAL* pfnGetBaseMap)(); #elseconst AFX_INTERFACEMAP* pBaseMap;#endifco
16、nst AFX_INTERFACEMAP_ENTRY* pEntry;BEGIN_INTERFACE_MAP(CDictionary, CCmdTarget)INTERFACE_PART(CDictionary, IID_IDictionary, Dictionary)INTERFACE_PART(CDictionary, IID_ISpellCheck, SpellCheck)END_INTERFACE_MAP()#define BEGIN_INTERFACE_MAP(theClass, theBase) const AFX_INTERFACEMAP* PASCAL theClass:_Ge
17、tBaseInterfaceMap() return &theBase:interfaceMap; const AFX_INTERFACEMAP* theClass:GetInterfaceMap() const return &theClass:interfaceMap; AFX_COMDAT const AFX_DATADEF AFX_INTERFACEMAP theClass:interfaceMap = &theClass:_GetBaseInterfaceMap, &theClass:_interfaceEntries0, ; AFX_COMDAT c
18、onst AFX_DATADEF AFX_INTERFACEMAP_ENTRY theClass:_interfaceEntries = #define INTERFACE_PART(theClass, iid, localClass) &iid, offsetof(theClass, m_x#localClass) , #define END_INTERFACE_MAP() NULL, (size_t)-1 ; class CDictionary : public CCmdTargetDECLARE_DYNCREATE(CDictionary) CDictionary(); / pr
19、otected constructor used by dynamic creationDECLARE_INTERFACE_MAP()./ IDictionaryBEGIN_INTERFACE_PART(Dictionary, IDictionary)INIT_INTERFACE_PART(CDictionary, Dictionary)STDMETHOD_(BOOL, Initialize)();STDMETHOD_(void, FreeLibrary)();END_INTERFACE_PART_STATIC(Dictionary) / ISpellCheckBEGIN_INTERFACE_
20、PART(SpellCheck, ISpellCheck)INIT_INTERFACE_PART(CDictionary, SpellCheck)STDMETHOD_(BOOL, CheckWord)(LPOLESTR, LPOLESTR *);END_INTERFACE_PART_STATIC(SpellCheck) ;STDMETHODIMP_(ULONG) CDictionary:XDictionary:AddRef()METHOD_PROLOGUE_EX_(CDictionary, Dictionary)return pThis-ExternalAddRef();lMETHOD_PRO
21、LOGUE_EX_宏定義:#define METHOD_PROLOGUE_EX(theClass, localClass) theClass* pThis = (theClass*)(BYTE*)this - m_nOffset); AFX_MANAGE_STATE(pThis-m_pModuleState) pThis; / avoid warning from compiler public:/ data used when CCmdTarget is made OLE awarelong m_dwRef;LPUNKNOWN m_pOuterUnknown; / external cont
22、rolling unknown if != NULLDWORD m_xInnerUnknown; / place-holder for inner controlling unknownpublic:/ advanced operationsvoid EnableAggregation(); / call to enable aggregationvoid ExternalDisconnect(); / forcibly disconnectLPUNKNOWN GetControllingUnknown();/ get controlling IUnknown for aggregate cr
23、eationpublic:/ these versions do not delegate to m_pOuterUnknownDWORD InternalQueryInterface(const void*, LPVOID* ppvObj);DWORD InternalAddRef();DWORD InternalRelease();/ these versions delegate to m_pOuterUnknownDWORD ExternalQueryInterface(const void*, LPVOID* ppvObj);DWORD ExternalAddRef();DWORD
24、ExternalRelease();DWORD CCmdTarget:InternalQueryInterface(const void* iid, LPVOID* ppvObj)/ check local interfacesif (*ppvObj = GetInterface(iid) != NULL) / interface was found - add a referenceExternalAddRef();return S_OK;/ check aggregatesif (*ppvObj = QueryAggregates(iid) != NULL)return S_OK;/ in
25、terface ID not found, fail the callreturn (DWORD)E_NOINTERFACE;DWORD CCmdTarget:ExternalAddRef()/ delegate to controlling unknown if aggregatedif (m_pOuterUnknown != NULL)return m_pOuterUnknown-AddRef();return InternalAddRef();DWORD CCmdTarget:ExternalRelease() / ./ QueryInterface that is exported t
26、o normal clientsDWORD CCmdTarget:ExternalQueryInterface(const void* iid, LPVOID* ppvObj)/ delegate to controlling unknown if aggregatedif (m_pOuterUnknown != NULL)return m_pOuterUnknown-QueryInterface(*(IID*)iid, ppvObj);return InternalQueryInterface(iid, ppvObj);STDMETHODIMP_(ULONG) CDictionary:XDi
27、ctionary:QueryInterface (const void* iid, LPVOID* ppvObj)METHOD_PROLOGUE_EX_(CDictionary, Dictionary)return pThis-ExternalQueryInterface (iid, ppvObj);l在在AppWizard中選中中選中“Automation”檢查框檢查框STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)AFX_MANAGE_STATE(AfxGetStaticModuleState();ret
28、urn AfxDllGetClassObject(rclsid, riid, ppv);STDAPI DllCanUnloadNow(void)AFX_MANAGE_STATE(AfxGetStaticModuleState();return AfxDllCanUnloadNow();/ by exporting DllRegisterServer, you can use regsvr.exeSTDAPI DllRegisterServer(void)AFX_MANAGE_STATE(AfxGetStaticModuleState();COleObjectFactory:UpdateRegi
29、stryAll();return S_OK;l通用的類廠,實(shí)現(xiàn)了通用的類廠,實(shí)現(xiàn)了IClassFactory2接口接口lCOleObjectFactory的主要信息是對(duì)象的的主要信息是對(duì)象的CLSID和對(duì)和對(duì)象的類型信息。象的類型信息。l它利用它利用MFC的動(dòng)態(tài)對(duì)象創(chuàng)建機(jī)制:的動(dòng)態(tài)對(duì)象創(chuàng)建機(jī)制: DECLARE_DYNCREATEl對(duì)象方面的支持:對(duì)象方面的支持: DECLARE_OLECREATE(.),定義如下,定義如下#define DECLARE_OLECREATE(class_name) public: static AFX_DATA COleObjectFactory factor
30、y; static AFX_DATA const GUID guid; lDECLARE_OLECREATE(.)lIMPLEMENT_OLECREATE#define IMPLEMENT_OLECREATE(class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) AFX_DATADEF COleObjectFactory class_name:factory(class_name:guid, RUNTIME_CLASS(class_name), FALSE, _T(external_name); AFX_CO
31、MDAT const AFX_DATADEF GUID class_name:guid = l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8 ; l狀態(tài)結(jié)構(gòu):狀態(tài)結(jié)構(gòu):AFX_MODULE_STATE,除了一些基本的全局信息,還,除了一些基本的全局信息,還包括一個(gè)類廠表。包括一個(gè)類廠表。lDllGetClassObject-AfxDllGetClassObject-AfxGetModuleState進(jìn)一步得到類廠表進(jìn)一步得到類廠表l類廠對(duì)象的構(gòu)造函數(shù)和析構(gòu)函數(shù)維護(hù)類廠表類廠對(duì)象的構(gòu)造函數(shù)和析構(gòu)函數(shù)維護(hù)類廠表l利用利用AppWizard創(chuàng)建創(chuàng)建COM程序工程框架
32、程序工程框架l利用利用ClassWizard添加添加COM對(duì)象類對(duì)象類BOOL CDictCompApp:InitInstance()/ Register all OLE server (factories) as running. / This enables the/ OLE libraries to create objects from other applications.COleObjectFactory:RegisterAll();return TRUE;BEGIN_INTERFACE_PART(Dictionary, IDictionary)INIT_INTERFACE_PAR
33、T(CDictionary, Dictionary)STDMETHOD_(BOOL, Initialize)();STDMETHOD_(BOOL, LoadLibrary)(LPOLESTR);STDMETHOD_(BOOL, InsertWord)(LPOLESTR, LPOLESTR);STDMETHOD_(void, DeleteWord)( LPOLESTR);STDMETHOD_(BOOL, LookupWord)(LPOLESTR, LPOLESTR *);STDMETHOD_(BOOL, RestoreLibrary)(LPOLESTR);STDMETHOD_(void, Fre
34、eLibrary)();END_INTERFACE_PART_STATIC(Dictionary) / ISpellCheckBEGIN_INTERFACE_PART(SpellCheck, ISpellCheck)INIT_INTERFACE_PART(CDictionary, SpellCheck)STDMETHOD_(BOOL, CheckWord)(LPOLESTR, LPOLESTR *);END_INTERFACE_PART_STATIC(SpellCheck)DECLARE_INTERFACE_MAP()extern C const IID IID_Dictionary = 0
35、x54bf6568, 0 x1007, 0 x11d1, 0 xb0, 0 xaa, 0 x44, 0 x45, 0 x53, 0 x54, 0 x00, 0 x00 ;extern C const IID IID_SpellCheck = 0 x54bf6569, 0 x1007, 0 x11d1, 0 xb0, 0 xaa, 0 x44, 0 x45, 0 x53, 0 x54, 0 x00, 0 x00 ;BEGIN_INTERFACE_MAP(CDictionaryObj, CCmdTarget)INTERFACE_PART(CDictionaryObj, IID_IDictionar
36、y, Dictionary)INTERFACE_PART(CDictionaryObj, IID_ISpellCheck, SpellCheck)END_INTERFACE_MAP()l在在CDictionaryObj聲明中加入:聲明中加入:DECLARE_OLECREATE(CDictionaryObj) l在在CDictionaryObj實(shí)現(xiàn)文件中加入:實(shí)現(xiàn)文件中加入:/ 54BF6567-1007-11D1-B0AA-444553540000I M P L E M E N T _ O L E C R E AT E ( C D i c t i o n a r y O b j , Dicti
37、onary.Object , 0 x54bf6567, 0 x1007, 0 x11d1, 0 xb0, 0 xaa, 0 x44, 0 x45, 0 x53, 0 x54, 0 x00, 0 x00)源對(duì)象(CCmdTarget 派生類)m_xConnPtContainer出接口 1IConnectionPointContainer調(diào)用 EnableConnections 進(jìn)行初始化連接映射表GetExtraConnectionPoints 函數(shù)指定內(nèi)置連接點(diǎn)枚舉器連接點(diǎn)對(duì)象 1出接口 2出接口 n連接點(diǎn)對(duì)象 2連接點(diǎn)對(duì)象 n事件 1事件 2事件 n事件激發(fā)函數(shù)激發(fā)事件或請(qǐng)求:在特定的連接點(diǎn)
38、上,對(duì)所有的連接向接收器發(fā)送事件或請(qǐng)求枚舉連接點(diǎn)發(fā)送事件或請(qǐng)求:調(diào)用 Invoke 函數(shù)l創(chuàng)建工程創(chuàng)建工程支持支持COMl定義出接口定義出接口編輯編輯.odl文件文件l利用利用MFC宏加入連接點(diǎn)聲明以及連接點(diǎn)對(duì)象的宏加入連接點(diǎn)聲明以及連接點(diǎn)對(duì)象的定義定義l在對(duì)象構(gòu)造函數(shù)中調(diào)用在對(duì)象構(gòu)造函數(shù)中調(diào)用EnableConnections();l在接口映射表中加入接口在接口映射表中加入接口IConnectionPointContainer的表項(xiàng),再加入的表項(xiàng),再加入連接映射表連接映射表l定義連接點(diǎn)類的虛函數(shù)定義連接點(diǎn)類的虛函數(shù)(至少為至少為GetIID)l加入事件激發(fā)函數(shù)加入事件激發(fā)函數(shù)l初始化初始化
39、AfxOleInitl定義出接口成員類定義出接口成員類l實(shí)現(xiàn)出接口成員類實(shí)現(xiàn)出接口成員類l創(chuàng)建源對(duì)象創(chuàng)建源對(duì)象l建立連接和取消連接建立連接和取消連接l完成可觸發(fā)事件的動(dòng)作完成可觸發(fā)事件的動(dòng)作lATL實(shí)現(xiàn)實(shí)現(xiàn)COM的機(jī)制完全不同于的機(jī)制完全不同于MFCl使用多繼承技術(shù)實(shí)現(xiàn)多個(gè)接口使用多繼承技術(shù)實(shí)現(xiàn)多個(gè)接口l支持多線程支持多線程l實(shí)現(xiàn)實(shí)現(xiàn)QueryInterface用到了特殊的技術(shù)用到了特殊的技術(shù)l創(chuàng)建對(duì)象機(jī)制不同于以往的技術(shù)創(chuàng)建對(duì)象機(jī)制不同于以往的技術(shù)l優(yōu)化優(yōu)化l封裝了一些數(shù)據(jù)類型封裝了一些數(shù)據(jù)類型 CComBSTR、CComVariant、CComPtr,等,等l實(shí)現(xiàn)實(shí)現(xiàn)COM接口和接口和CO
40、M對(duì)象對(duì)象 接口映射表、對(duì)象映射表,等接口映射表、對(duì)象映射表,等l窗口的支持窗口的支持 CWindow、CWindowImpl、CDialogImpl,等,等l其他其他COM特征的支持特征的支持 永久性支持永久性支持 連接點(diǎn)支持連接點(diǎn)支持 集合對(duì)象和枚舉器對(duì)象集合對(duì)象和枚舉器對(duì)象 ActiveX control and container 等等l封裝了封裝了BSTR類型類型l提供了大量便利的字符串操作提供了大量便利的字符串操作 構(gòu)造函數(shù)構(gòu)造函數(shù) 各種操作符以及一般的字符串操作各種操作符以及一般的字符串操作 對(duì)于流對(duì)于流(stream)的支持的支持l在需要在需要BSTR的地方,都可以用的地方,都
41、可以用CComBSTR來代替來代替l注意注意owershipl封裝了封裝了VARIANT屬性屬性l提供了常用的操作提供了常用的操作 構(gòu)造函數(shù)構(gòu)造函數(shù) 各種操作符以及一般的管理操作各種操作符以及一般的管理操作 對(duì)于流對(duì)于流(stream)的支持的支持l在需要在需要VARIANT的地方,都可以用的地方,都可以用CComVARIANT來代替來代替lSmart pointertemplatetemplateclass CComPtrclass CComQIPtrpublic:public:T* p;T* p;.;l優(yōu)點(diǎn):優(yōu)點(diǎn): 自動(dòng)管理自動(dòng)管理AddRef/Release 在大多數(shù)情況下,可以當(dāng)作接口
42、指針來使用在大多數(shù)情況下,可以當(dāng)作接口指針來使用l注意:禁止調(diào)用注意:禁止調(diào)用“-Release”和和“-AddRef”l封裝了封裝了IDispatch接口接口l除了對(duì)接口指針的管理之外,有下面的功能:除了對(duì)接口指針的管理之外,有下面的功能: 屬性訪問函數(shù):屬性訪問函數(shù): GetIDOfName/ GetProperty/ PutProperty GetPropertyByName/ PutPropertyByName 方法訪問函數(shù):方法訪問函數(shù): by DISPID:Invoke0/Invoke1/Invoke2/InvokeN by Name:Invoke0/Invoke1/Invoke2
43、/InvokeN 兩個(gè)靜態(tài)函數(shù):兩個(gè)靜態(tài)函數(shù): By DISPID:GetProperty/PutPropertyCMyClassCComObjectRootBaseCComObjectRootExIXxxImplIMyItf1IMyItf2CComObject等CComXxxThreadModellObjectMainlstatic InternalQueryInterfacelOuterAddRef/OuterRelease/OuterQueryInterfacelInternalFinalConstructAddRef/InternalFinalConstructReleasel其他一些
44、靜態(tài)函數(shù)其他一些靜態(tài)函數(shù)l聯(lián)合:聯(lián)合:unionlong m_dwRef;IUnknown* m_pOuterUnknown;l用到了用到了trait技術(shù)技術(shù)l通過編譯時(shí)刻的類型提供通過編譯時(shí)刻的類型提供just thread-safe enoughlCComSingleThreadModellCComMultiThreadModellCComMultiThreadNoCSl提供了兩個(gè)靜態(tài)成員函數(shù)和三個(gè)提供了兩個(gè)靜態(tài)成員函數(shù)和三個(gè)typedef Increment、Decrement AutoCriticalSection、CriticalSection、ThreadModelNoCSlCCo
45、mObjectRootEx InternalAddRef InternalRelease 作用在匿名聯(lián)合的作用在匿名聯(lián)合的m_dwRef成員上成員上lCComObjectRootEx定義了一把鎖定義了一把鎖 鎖的類型為鎖的類型為AutoCriticalSection 對(duì)鎖的封裝對(duì)鎖的封裝ObjectLock,wrapperl用于未被聚合的情況下用于未被聚合的情況下lTable-driven QueryInterfacelInterface MapBEGIN_COM_MAP(class) COM_INTERFACE_ENTRY(itf)END_COM_MAPl表中每一項(xiàng)表中每一項(xiàng)struct _
46、ATL_INTMAP_ENTRY const IID* piid;DWORD dw;_ATL_CREATORARGFUNC *pFunc;lIDispatchImpllIPersistStreamInitImpllIConnectionPointContainerImpll舉例:舉例:template class IDispatchImpl : public T ;template class IConnectionPointContainerImpl : public IConnectionPointContainer.;class CMyObject : public IDispatchI
47、mpl,public IConnectionPointContainerImpl;l決定這個(gè)決定這個(gè)COM對(duì)象如何被分配,是否被聚合等對(duì)象如何被分配,是否被聚合等l區(qū)別:區(qū)別: 線程模型是以每個(gè)類為基礎(chǔ)的,線程模型是以每個(gè)類為基礎(chǔ)的,per-class,可以封裝到基類中,可以封裝到基類中 對(duì)象的生命周期和身份標(biāo)識(shí)是以每個(gè)對(duì)象實(shí)例為基礎(chǔ)的,對(duì)象的生命周期和身份標(biāo)識(shí)是以每個(gè)對(duì)象實(shí)例為基礎(chǔ)的,per-object,要延后到最終的派生類做出決定,要延后到最終的派生類做出決定lCComObject類:類: template CComObject : public Base ; 支持聚合:支持聚合:cla
48、ss CComAggObject; 支持聚合:支持聚合: class CComPolyObject; template CComObjectCached : public Base ; template CComObjectNoLock : public Base ; template CComObjectGlobal : public Base ; template CComObjectStack : public Base ;l兩個(gè)步驟:兩個(gè)步驟: 使用使用CRT的構(gòu)造器的構(gòu)造器 FinalConstructl對(duì)應(yīng)于對(duì)應(yīng)于FinalConstruct有有FinalReleasel舉例:舉例
49、:CMyClassFactory:CreateInstance() CComObject *pObj = new CComObject;.pObj-InternalFinalConstructAddRef();HRESULT hr = FinalConstruct();pObj-InternalFinalConstructRelease();l每個(gè)每個(gè)creator類有一個(gè)靜態(tài)類有一個(gè)靜態(tài)CreateInstance函數(shù):函數(shù):HRESULT WINAPI CreateInstance(void* pv, REFIID riid, LPVOID* ppv);l舉例:舉例:template cl
50、ass CComCreator public:static HRESULT WINAPI CreateInstance(void* pv, REFIID riid, LPVOID* ppv) T *pObj = new T(pv);.pObj-InternalFinalConstructAddRef();HRESULT hr = FinalConstruct();pObj-InternalFinalConstructRelease();hr = p-QueryInterface(riid, ppv);l其他的其他的creator類有類有 CComCreator2 根據(jù)根據(jù)pv參數(shù)是否為參數(shù)是否
51、為null從兩個(gè)對(duì)象類中擇一從兩個(gè)對(duì)象類中擇一 CComFailCreator 假的創(chuàng)建類假的創(chuàng)建類l在在CMyObject類中定義一個(gè)類型類中定義一個(gè)類型_CreatorClass,例如,例如 typedef CComCreatorCComObject _CreatorClass;lCComCoClass定義:定義:templateclass CComCoClass public:template static HRESULT CreateInstance(IUnknown* punkOuter, Q* pp) return T:_CreatorClass:CreateInstance(pu
52、nkOuter, _uuidof(Q), (void *)pp); ;CMyClassCComObjectRootBaseCComObjectRootExIXxxImplIMyItf1IMyItf2CComContainedObjectCComXxxThreadModelCComAggObjectIUnknown委托IUnknown非委托IUnknowntemplate class CComAggObject :public IUnknown,public CComObjectRootExpublic :STDMETHOD_(ULONG, AddRef)() STDMETHOD_(ULONG,
53、 Release)() STDMETHOD(QueryInterface)(REFIID iid, void * ppvObject)CComContainedObject m_contained;非委托IUnknown委托IUnknowntemplate /Base must be derived from CComObjectRootclass CComContainedObject : public Basepublic:typedef Base _BaseClass;CComContainedObject(void* pv) m_pOuterUnknown = (IUnknown*)p
54、v;STDMETHOD_(ULONG, AddRef)() return OuterAddRef();STDMETHOD_(ULONG, Release)() return OuterRelease();STDMETHOD(QueryInterface)(REFIID iid, void * ppvObject) / 調(diào)用調(diào)用 OuterQueryInterface(iid, ppvObject); IUnknown* GetControllingUnknown() ;/ CComObjectRootBase基類中聯(lián)合成員m_pOuterUnknown起作用lCOM_INTERFACE_ENT
55、RYlCOM_INTERFACE_ENTRY_IID(iid, x)lCOM_INTERFACE_ENTRY2(x, x2)lCOM_INTERFACE_ENTRY2_IID(iid, x, x2)lCOM_INTERFACE_ENTRY_FUNC(iid, dw, func)lCOM_INTERFACE_ENTRY_FUNC_BLIND(dw, func)lCOM_INTERFACE_ENTRY_TEAR_OFF(iid, x)lCOM_INTERFACE_ENTRY_CACHED_TEAR_OFF(iid, x, punk)lCOM_INTERFACE_ENTRY_AGGREGATE(ii
56、d, punk)lCOM_INTERFACE_ENTRY_AGGREGATE_BLIND(punk)lCOM_INTERFACE_ENTRY_CHAIN(classname)l功能功能 Register and Unregister all class exposing class object managing servers lifetimelATL實(shí)現(xiàn)結(jié)構(gòu)實(shí)現(xiàn)結(jié)構(gòu) object map CComModulel示例示例BEGIN_OBJECT_MAP(ObjectMap)OBJECT_ENTRY(CLSID_DictionaryObj, CDictionaryObj)OBJECT_ENTR
57、Y_NON_CREATEABLE(COtherObj)END_OBJECT_MAP()l宏定義:宏定義:#define BEGIN_OBJECT_MAP(x) static _ATL_OBJMAP_ENTRY x = #define END_OBJECT_MAP() NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL;struct _ATL_OBJMAP_ENTRYconst CLSID* pclsid;HRESULT (WINAPI *pfnUpdateRegistry)(BOOL bRegister);_ATL_CREATORFUNC* pfnGe
58、tClassObject;_ATL_CREATORFUNC* pfnCreateInstance;IUnknown* pCF;DWORD dwRegister;_ATL_DESCRIPTIONFUNC* pfnGetObjectDescription;_ATL_CATMAPFUNC* pfnGetCategoryMap;void (WINAPI *pfnObjectMain)(bool bStarting);#define OBJECT_ENTRY(clsid, class) &clsid, class:UpdateRegistry, class:_ClassFactoryCreato
59、rClass:CreateInstance, class:_CreatorClass:CreateInstance, NULL, 0, class:GetObjectDescription, class:GetCategoryMap, class:ObjectMain ,#define OBJECT_ENTRY_NON_CREATEABLE(class) &CLSID_NULL, class:UpdateRegistry, NULL, NULL, NULL, 0, NULL, class:GetCategoryMap, class:ObjectMain ,lOBJECT_ENTRY中的
60、中的class:UpdateRegistry項(xiàng)項(xiàng) 要求每個(gè)類都要提供要求每個(gè)類都要提供UpdateRegistry成員成員 宏:宏: DECLARE_NO_REGISTRY() DECLARE_REGISTRY(class, pid, vpid, nid, flags) DECLARE_REGISTRY_RESOURCE(x) DECLARE_REGISTRY_RESOURCEID(x)l缺省生成的工程使用資源進(jìn)行注冊(cè)缺省生成的工程使用資源進(jìn)行注冊(cè) Registry Script FilelOBJECT_ENTRY宏包含:宏包含:class:_ClassFactoryCreatorClass:CreateInstancelDECLARE_CLASSFACTORY_EX宏定
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 機(jī)動(dòng)車故障排查服務(wù)合同
- 校園食堂合同范本
- 定期市場報(bào)告合作合同
- 阿壩師范學(xué)院《基礎(chǔ)醫(yī)學(xué)實(shí)驗(yàn)技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 陜西交通職業(yè)技術(shù)學(xué)院《循證藥學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 陜西國際商貿(mào)學(xué)院《薪酬與福利》2023-2024學(xué)年第二學(xué)期期末試卷
- 陜西機(jī)電職業(yè)技術(shù)學(xué)院《化妝品廣告營銷》2023-2024學(xué)年第二學(xué)期期末試卷
- 陜西科技大學(xué)《漢語言文學(xué)專業(yè)文獻(xiàn)檢索》2023-2024學(xué)年第一學(xué)期期末試卷
- 陜西職業(yè)技術(shù)學(xué)院《傳熱學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 基層學(xué)習(xí)教育講話稿- 以“思想、問題、整改”的基本路線值得借鑒
- 智慧景區(qū)智能化系統(tǒng)總體施工組織設(shè)計(jì)方案
- 合并財(cái)務(wù)報(bào)表培訓(xùn)資料課件
- 2022年新疆師范大學(xué)輔導(dǎo)員招聘考試筆試試題及答案解析
- DB32-T 4357-2022 建筑工程施工機(jī)械安裝質(zhì)量檢驗(yàn)規(guī)程
- 流行性腮腺炎及其護(hù)理
- 《月是故鄉(xiāng)明》定稿 優(yōu)秀獎(jiǎng) 教學(xué)課件
- 防臺(tái)防汛管理制度
- 廣電運(yùn)通研究報(bào)告:數(shù)字人民幣促產(chǎn)業(yè)升級(jí)-AI+城市助業(yè)務(wù)轉(zhuǎn)型
- 北師大版生物七年級(jí)下冊(cè) 第10章 第2節(jié) 《人體細(xì)胞獲得氧氣的過程》學(xué)案 (表格式無答案)
- 港澳臺(tái)聯(lián)考考試大綱
- 移動(dòng)式腳手架安全操作規(guī)程
評(píng)論
0/150
提交評(píng)論