COM培訓(xùn)(共79張)_第1頁
COM培訓(xùn)(共79張)_第2頁
COM培訓(xùn)(共79張)_第3頁
COM培訓(xùn)(共79張)_第4頁
COM培訓(xùn)(共79張)_第5頁
已閱讀5頁,還剩74頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、COM開發(fā)lWin32 SDK和和MFC介紹介紹lMFC對對COM的支持的支持l用用MFC開發(fā)開發(fā)COM組件組件lATL對對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 使用的數(shù)據(jù)結(jié)構(gòu)的說明

2、。Objidl.h所有標(biāo)準(zhǔn)接口的定義, 既可用于C 語言風(fēng)格的定義, 也可用于C+語言風(fēng)格的定義。Comdef.h所有標(biāo)準(zhǔn)接口以及COM 和OLE 內(nèi)部對象的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; STDMETHOD_(U

3、LONG,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,它從接口 baseiface 派

4、生。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在類的實現(xiàn)文件中加入表和表項的定義:在類的實

5、現(xiàn)文件中加入表和表項的定義: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_COMMAND_UI

6、(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)用、基于對話框應(yīng)用、基于對話框程序程序lDLL應(yīng)用:靜態(tài)連接應(yīng)用:靜態(tài)連接MFC庫的正規(guī)庫的正規(guī)DLL、動態(tài)、動態(tài)連接連接MFC庫的正規(guī)庫的正規(guī)DLL、MFC擴展擴展DLLl其他應(yīng)用:其他應(yīng)用: 支持支持OLE服務(wù)或者包容器的服務(wù)或者包容器的SDI應(yīng)用應(yīng)用 支持支持OLE服務(wù)或者包容器的服

7、務(wù)或者包容器的MDI應(yīng)用應(yīng)用 支持自動化支持自動化(Automation)服務(wù)的服務(wù)的SDI或者或者MDI程序程序 ActiveX控制應(yīng)用控制應(yīng)用(OCX應(yīng)用應(yīng)用)CObjectCCmdTargetCWnd應(yīng)用類結(jié)構(gòu)窗口支持異常類文件服務(wù)類文檔類框架窗口類控制條類屬性頁表類對話框類視類控制類圖形設(shè)備環(huán)境類控制支持類Windows 套接字類圖形對象類菜單類ODBC 支持類DAO 支持類同步類其它類:其它類:Internet 支持類自動化類型運行時刻對象支持簡單值類型結(jié)構(gòu)其它支持類集合模板類用于同步的類數(shù)組類列表類映射類Internet 類class CDictionary /構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)

8、造函數(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 ULO

9、NG _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(); virtual UL

10、ONG _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_pParent

11、 = 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 ;ULONG

12、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 m_nWor

13、dNumberm_nStructNumberQueryInterfaceAddRefRelease.m_dictionaryObjm_spellCheckObjQueryInterfaceAddRefReleaseQueryInterfaceAddRefReleaseVtable for IDictionaryVtable for ISpellCheckCDictionaryvptrvptrCDictionary的非虛函數(shù)lCCmdTarget類類lCCmdTarget:m_dwRef為引用計數(shù)為引用計數(shù)l接口映射表與消息映射表非常類似接口映射表與消息映射表非常類似l接口映射表:記錄了接口映射

14、表:記錄了CCmdTarget類中類中每一個嵌套類的接口每一個嵌套類的接口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_INTERFA

15、CEMAP* 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;#endifconst AFX

16、_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:_GetBaseIn

17、terfaceMap() 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 const AF

18、X_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(); / protected

19、 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_PART(Sp

20、ellCheck, 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_PROLOGUE_E

21、X_宏定義:#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 controlling

22、 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 creationp

23、ublic:/ 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 Externa

24、lRelease();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;/ interface

25、 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 to norma

26、l 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:XDictionar

27、y: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();return Afx

28、DllGetClassObject(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:UpdateRegistryAll

29、();return S_OK;l通用的類廠,實現(xiàn)了通用的類廠,實現(xiàn)了IClassFactory2接口接口lCOleObjectFactory的主要信息是對象的的主要信息是對象的CLSID和對和對象的類型信息。象的類型信息。l它利用它利用MFC的動態(tài)對象創(chuàng)建機制:的動態(tài)對象創(chuàng)建機制: DECLARE_DYNCREATEl對象方面的支持:對象方面的支持: DECLARE_OLECREATE(.),定義如下,定義如下#define DECLARE_OLECREATE(class_name) public: static AFX_DATA COleObjectFactory factory; stat

30、ic 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_COMDAT co

31、nst 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,除了一些基本的全局信息,除了一些基本的全局信息,還包括一個類廠表。還包括一個類廠表。lDllGetClassObject-AfxDllGetClassObject-AfxGetModuleState進一步得到類廠表進一步得到類廠表l類廠對象的構(gòu)造函數(shù)和析構(gòu)函數(shù)維護類廠表類廠對象的構(gòu)造函數(shù)和析構(gòu)函數(shù)維護類廠表l利用利用AppWizard創(chuàng)建創(chuàng)建COM程序工程框架程序工程框架l利

32、用利用ClassWizard添加添加COM對象類對象類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_PART(CDicti

33、onary, 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, FreeLibrary

34、)();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 x54bf656

35、8, 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_IDictionary, Dicti

36、onary)INTERFACE_PART(CDictionaryObj, IID_ISpellCheck, SpellCheck)END_INTERFACE_MAP()l在在CDictionaryObj聲明中加入:聲明中加入:DECLARE_OLECREATE(CDictionaryObj) l在在CDictionaryObj實現(xiàn)文件中加入:實現(xiàn)文件中加入:/ 54BF6567-1007-11D1-B0AA-444553540000I M P L E M E N T _ O L E C R E A T E ( C D i c t i o n a r y O b j , Dictionary.O

37、bject , 0 x54bf6567, 0 x1007, 0 x11d1, 0 xb0, 0 xaa, 0 x44, 0 x45, 0 x53, 0 x54, 0 x00, 0 x00)lATL實現(xiàn)實現(xiàn)COM的機制完全不同于的機制完全不同于MFCl使用多繼承技術(shù)實現(xiàn)多個接口使用多繼承技術(shù)實現(xiàn)多個接口l支持多線程支持多線程l實現(xiàn)實現(xiàn)QueryInterface用到了特殊的技術(shù)用到了特殊的技術(shù)l創(chuàng)建對象機制不同于以往的技術(shù)創(chuàng)建對象機制不同于以往的技術(shù)l優(yōu)化優(yōu)化l封裝了一些數(shù)據(jù)類型封裝了一些數(shù)據(jù)類型 CComBSTR、CComVariant、CComPtr,等,等l實現(xiàn)實現(xiàn)COM接口和接口和COM

38、對象對象 接口映射表、對象映射表,等接口映射表、對象映射表,等l窗口的支持窗口的支持 CWindow、CWindowImpl、CDialogImpl,等,等l其他其他COM特征的支持特征的支持 永久性支持永久性支持 連接點支持連接點支持 集合對象和枚舉器對象集合對象和枚舉器對象 ActiveX control and container 等等l封裝了封裝了BSTR類型類型l提供了大量便利的字符串操作提供了大量便利的字符串操作 構(gòu)造函數(shù)構(gòu)造函數(shù) 各種操作符以及一般的字符串操作各種操作符以及一般的字符串操作 對于流對于流(stream)的支持的支持l在需要在需要BSTR的地方,都可以用的地方,都可

39、以用CComBSTR來代替來代替l注意注意owershipl封裝了封裝了VARIANT屬性屬性l提供了常用的操作提供了常用的操作 構(gòu)造函數(shù)構(gòu)造函數(shù) 各種操作符以及一般的管理操作各種操作符以及一般的管理操作 對于流對于流(stream)的支持的支持l在需要在需要VARIANT的地方,都可以用的地方,都可以用CComVARIANT來代替來代替lSmart pointertemplatetemplateclass CComPtrclass CComQIPtrpublic:public:T* p;T* p;.;l優(yōu)點:優(yōu)點: 自動管理自動管理AddRef/Release 在大多數(shù)情況下,可以當(dāng)作接口指

40、針來使用在大多數(shù)情況下,可以當(dāng)作接口指針來使用l注意:禁止調(diào)用注意:禁止調(diào)用“-Release”和和“-AddRef”l封裝了封裝了IDispatch接口接口l除了對接口指針的管理之外,有下面的功能:除了對接口指針的管理之外,有下面的功能: 屬性訪問函數(shù):屬性訪問函數(shù): GetIDOfName/ GetProperty/ PutProperty GetPropertyByName/ PutPropertyByName 方法訪問函數(shù):方法訪問函數(shù): by DISPID:Invoke0/Invoke1/Invoke2/InvokeN by Name:Invoke0/Invoke1/Invoke2/

41、InvokeN 兩個靜態(tài)函數(shù):兩個靜態(tài)函數(shù): By DISPID:GetProperty/PutPropertyCMyClassCComObjectRootBaseCComObjectRootExIXxxImplIMyItf1IMyItf2CComObject等CComXxxThreadModellObjectMainlstatic InternalQueryInterfacelOuterAddRef/OuterRelease/OuterQueryInterfacelInternalFinalConstructAddRef/InternalFinalConstructReleasel其他一些靜

42、態(tài)函數(shù)其他一些靜態(tài)函數(shù)l聯(lián)合:聯(lián)合:unionlong m_dwRef;IUnknown* m_pOuterUnknown;l用到了用到了trait技術(shù)技術(shù)l通過編譯時刻的類型提供通過編譯時刻的類型提供just thread-safe enoughlCComSingleThreadModellCComMultiThreadModellCComMultiThreadNoCSl提供了兩個靜態(tài)成員函數(shù)和三個提供了兩個靜態(tài)成員函數(shù)和三個typedef Increment、Decrement AutoCriticalSection、CriticalSection、ThreadModelNoCSlCCom

43、ObjectRootEx InternalAddRef InternalRelease 作用在匿名聯(lián)合的作用在匿名聯(lián)合的m_dwRef成員上成員上lCComObjectRootEx定義了一把鎖定義了一把鎖 鎖的類型為鎖的類型為AutoCriticalSection 對鎖的封裝對鎖的封裝ObjectLock,wrapperl用于未被聚合的情況下用于未被聚合的情況下lTable-driven QueryInterfacelInterface MapBEGIN_COM_MAP(class) COM_INTERFACE_ENTRY(itf)END_COM_MAPl表中每一項表中每一項struct _A

44、TL_INTMAP_ENTRY const IID* piid;DWORD dw;_ATL_CREATORARGFUNC *pFunc;lIDispatchImpllIPersistStreamInitImpllIConnectionPointContainerImpll舉例:舉例:template class IDispatchImpl : public T ;template class IConnectionPointContainerImpl : public IConnectionPointContainer.;class CMyObject : public IDispatchIm

45、pl,public IConnectionPointContainerImpl;l決定這個決定這個COM對象如何被分配,是否被聚合等對象如何被分配,是否被聚合等l區(qū)別:區(qū)別: 線程模型是以每個類為基礎(chǔ)的,線程模型是以每個類為基礎(chǔ)的,per-class,可以封裝到基類中,可以封裝到基類中 對象的生命周期和身份標(biāo)識是以每個對象實例為基礎(chǔ)的,對象的生命周期和身份標(biāo)識是以每個對象實例為基礎(chǔ)的,per-object,要延后到最終的派生類做出決定,要延后到最終的派生類做出決定lCComObject類:類: template CComObject : public Base ; 支持聚合:支持聚合:clas

46、s CComAggObject; 支持聚合:支持聚合: class CComPolyObject; template CComObjectCached : public Base ; template CComObjectNoLock : public Base ; template CComObjectGlobal : public Base ; template CComObjectStack : public Base ;l兩個步驟:兩個步驟: 使用使用CRT的構(gòu)造器的構(gòu)造器 FinalConstructl對應(yīng)于對應(yīng)于FinalConstruct有有FinalReleasel舉例:舉例:

47、CMyClassFactory:CreateInstance() CComObject *pObj = new CComObject;.pObj-InternalFinalConstructAddRef();HRESULT hr = FinalConstruct();pObj-InternalFinalConstructRelease();l每個每個creator類有一個靜態(tài)類有一個靜態(tài)CreateInstance函數(shù):函數(shù):HRESULT WINAPI CreateInstance(void* pv, REFIID riid, LPVOID* ppv);l舉例:舉例:template cla

48、ss 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ù)是否為

49、null從兩個對象類中擇一從兩個對象類中擇一 CComFailCreator 假的創(chuàng)建類假的創(chuàng)建類l在在CMyObject類中定義一個類型類中定義一個類型_CreatorClass,例如,例如 typedef CComCreatorCComObject _CreatorClass;lCComCoClass定義:定義:templateclass CComCoClass public:template static HRESULT CreateInstance(IUnknown* punkOuter, Q* pp) return T:_CreatorClass:CreateInstance(pun

50、kOuter, _uuidof(Q), (void *)pp); ;CMyClassCComObjectRootBaseCComObjectRootExIXxxImplIMyItf1IMyItf2CComContainedObjectCComXxxThreadModelCComAggObjectIUnknown委托IUnknown非委托IUnknowntemplate class CComAggObject :public IUnknown,public CComObjectRootExpublic :STDMETHOD_(ULONG, AddRef)() STDMETHOD_(ULONG,

51、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*)pv

52、;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_ENTR

53、YlCOM_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(iid

54、, punk)lCOM_INTERFACE_ENTRY_AGGREGATE_BLIND(punk)lCOM_INTERFACE_ENTRY_CHAIN(classname)l功能功能 Register and Unregister all class exposing class object managing servers lifetimelATL實現(xiàn)結(jié)構(gòu)實現(xiàn)結(jié)構(gòu) object map CComModulel示例示例BEGIN_OBJECT_MAP(ObjectMap)OBJECT_ENTRY(CLSID_DictionaryObj, CDictionaryObj)OBJECT_ENTRY

55、_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* pfnGet

56、ClassObject;_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:_ClassFactoryCreator

57、Class: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中的中的class:UpdateRegistry項項 要求每個類都要提供要求每個類都要提供UpdateRegistry成員成員 宏:宏: DECLARE_NO_REGISTRY() DECLARE_REGISTRY(class, pid, vpid, nid, flags) DECLARE_REGISTRY_RESOURCE(x) DECLARE_REGISTRY_RESOURCEID(x)l缺省生成的工程使用資源進行注冊缺省生成的工程使用資源進行注冊 Regi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論