




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、潘爱民2003-11-7http:/ SDK和和MFC介绍介绍lMFC对对COM的支持的支持l用用MFC开发开发COM组件组件lATL对对COM的支持的支持l用用ATL开发开发COM组件组件l布置作业布置作业l入口函数入口函数WinMainl应用初始化应用初始化l主窗口的创建及显示主窗口的创建及显示l消息分发循环消息分发循环l程序结束处理程序结束处理lWin32 SDK包括包括COM库函数的支持库函数的支持Win32 SDK 提供的一些头文件的说明头文件说明Unknwn.h标准接口IUnknown 和IClassFactory的IID 及接口成员函数的定义。Wtypes.h包含了COM 使用的
2、数据结构的说明。Objidl.h所有标准接口的定义, 既可用于C 语言风格的定义, 也可用于C+语言风格的定义。Comdef.h所有标准接口以及COM 和OLE 内部对象的CLSID。ObjBase.h所有的COM API 函数的说明。Ole2.h所有经过封装的OLE 辅助函数。 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 接口有关的一些宏的说明宏说明DECLARE_INTERFACE(iface)声明接口 iface,它不从其它的接口派生。DECLARE_INTERFACE_( iface, baseiface)声明接口 iface,它从接口 base
4、iface 派生。STDMETHOD(method)声明接口成员函数 method,函数返回类型为 HRESULT。STDMETHOD_(type,method)声明接口成员函数 method,函数返回类型为 type。l应用类应用类 AfxGetApp CWinApp:InitInstance CWinApp:ExitInstance CWinApp:OnIdle CWinApp:Run CWnd *m_pMainWndl窗口类窗口类 AfxGetMainWndl在在CWnd派生类定义中加入声明:派生类定义中加入声明:DECLARE_MESSAGE_MAP()l在类的实现文件中加入表和表项的
5、定义:在类的实现文件中加入表和表项的定义: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常规应用:常规应用:MDI应用、应用、SDI应用、基于对话框应用、基于对话框程序程序lDLL应用:静态连接应用:静态连接MFC库的正规库的正规DLL、动态、动态连接连接MFC库的正规库的正规DLL、MFC扩展扩展DLLl其他应用:其他应用: 支持支持OLE服务或者包容器的服务或者包容器的SDI应用应用 支持支持OLE服务
7、或者包容器的服务或者包容器的MDI应用应用 支持自动化支持自动化(Automation)服务的服务的SDI或者或者MDI程序程序 ActiveX控制应用控制应用(OCX应用应用)CObjectCCmdTargetCWnd应用类结构窗口支持异常类文件服务类文档类框架窗口类控制条类属性页表类对话框类视类控制类图形设备环境类控制支持类Windows 套接字类图形对象类菜单类ODBC 支持类DAO 支持类同步类其它类:其它类:Internet 支持类自动化类型运行时刻对象支持简单值类型结构其它支持类集合模板类用于同步的类数组类列表类映射类Internet 类class CDictionary /构造函
8、数和析构函数构造函数和析构函数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;续续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的非虚函数lCCmdTarget类类lCCmdTarget:m_dwRef为引用计数为引用计数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_
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通用的类厂,实现了通用的类厂,实现了IClassFactory2接口接口lCOleObjectFactory的主要信息是对象的的主要信息是对象的CLSID和对和对象的类型信息。象的类型信息。l它利用它利用MFC的动态对象创建机制:的动态对象创建机制: DECLARE_DYNCREATEl对象方面的支持:对象方面的支持: 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状态结构:状态结构:AFX_MODULE_STATE,除了一些基本的全局信息,还,除了一些基本的全局信息,还包括一个类厂表。包括一个类厂表。lDllGetClassObject-AfxDllGetClassObject-AfxGetModuleState进一步得到类厂表进一步得到类厂表l类厂对象的构造函数和析构函数维护类厂表类厂对象的构造函数和析构函数维护类厂表l利用利用AppWizard创建创建COM程序工程框架
32、程序工程框架l利用利用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_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实现文件中加入:实现文件中加入:/ 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)源对象(CCmdTarget 派生类)m_xConnPtContainer出接口 1IConnectionPointContainer调用 EnableConnections 进行初始化连接映射表GetExtraConnectionPoints 函数指定内置连接点枚举器连接点对象 1出接口 2出接口 n连接点对象 2连接点对象 n事件 1事件 2事件 n事件激发函数激发事件或请求:在特定的连接点
38、上,对所有的连接向接收器发送事件或请求枚举连接点发送事件或请求:调用 Invoke 函数l创建工程创建工程支持支持COMl定义出接口定义出接口编辑编辑.odl文件文件l利用利用MFC宏加入连接点声明以及连接点对象的宏加入连接点声明以及连接点对象的定义定义l在对象构造函数中调用在对象构造函数中调用EnableConnections();l在接口映射表中加入接口在接口映射表中加入接口IConnectionPointContainer的表项,再加入的表项,再加入连接映射表连接映射表l定义连接点类的虚函数定义连接点类的虚函数(至少为至少为GetIID)l加入事件激发函数加入事件激发函数l初始化初始化
39、AfxOleInitl定义出接口成员类定义出接口成员类l实现出接口成员类实现出接口成员类l创建源对象创建源对象l建立连接和取消连接建立连接和取消连接l完成可触发事件的动作完成可触发事件的动作lATL实现实现COM的机制完全不同于的机制完全不同于MFCl使用多继承技术实现多个接口使用多继承技术实现多个接口l支持多线程支持多线程l实现实现QueryInterface用到了特殊的技术用到了特殊的技术l创建对象机制不同于以往的技术创建对象机制不同于以往的技术l优化优化l封装了一些数据类型封装了一些数据类型 CComBSTR、CComVariant、CComPtr,等,等l实现实现COM接口和接口和CO
40、M对象对象 接口映射表、对象映射表,等接口映射表、对象映射表,等l窗口的支持窗口的支持 CWindow、CWindowImpl、CDialogImpl,等,等l其他其他COM特征的支持特征的支持 永久性支持永久性支持 连接点支持连接点支持 集合对象和枚举器对象集合对象和枚举器对象 ActiveX control and container 等等l封装了封装了BSTR类型类型l提供了大量便利的字符串操作提供了大量便利的字符串操作 构造函数构造函数 各种操作符以及一般的字符串操作各种操作符以及一般的字符串操作 对于流对于流(stream)的支持的支持l在需要在需要BSTR的地方,都可以用的地方,都
41、可以用CComBSTR来代替来代替l注意注意owershipl封装了封装了VARIANT属性属性l提供了常用的操作提供了常用的操作 构造函数构造函数 各种操作符以及一般的管理操作各种操作符以及一般的管理操作 对于流对于流(stream)的支持的支持l在需要在需要VARIANT的地方,都可以用的地方,都可以用CComVARIANT来代替来代替lSmart pointertemplatetemplateclass CComPtrclass CComQIPtrpublic:public:T* p;T* p;.;l优点:优点: 自动管理自动管理AddRef/Release 在大多数情况下,可以当作接口
42、指针来使用在大多数情况下,可以当作接口指针来使用l注意:禁止调用注意:禁止调用“-Release”和和“-AddRef”l封装了封装了IDispatch接口接口l除了对接口指针的管理之外,有下面的功能:除了对接口指针的管理之外,有下面的功能: 属性访问函数:属性访问函数: GetIDOfName/ GetProperty/ PutProperty GetPropertyByName/ PutPropertyByName 方法访问函数:方法访问函数: by DISPID:Invoke0/Invoke1/Invoke2/InvokeN by Name:Invoke0/Invoke1/Invoke2
43、/InvokeN 两个静态函数:两个静态函数: By DISPID:GetProperty/PutPropertyCMyClassCComObjectRootBaseCComObjectRootExIXxxImplIMyItf1IMyItf2CComObject等CComXxxThreadModellObjectMainlstatic InternalQueryInterfacelOuterAddRef/OuterRelease/OuterQueryInterfacelInternalFinalConstructAddRef/InternalFinalConstructReleasel其他一些
44、静态函数其他一些静态函数l联合:联合:unionlong m_dwRef;IUnknown* m_pOuterUnknown;l用到了用到了trait技术技术l通过编译时刻的类型提供通过编译时刻的类型提供just thread-safe enoughlCComSingleThreadModellCComMultiThreadModellCComMultiThreadNoCSl提供了两个静态成员函数和三个提供了两个静态成员函数和三个typedef Increment、Decrement AutoCriticalSection、CriticalSection、ThreadModelNoCSlCCo
45、mObjectRootEx InternalAddRef InternalRelease 作用在匿名联合的作用在匿名联合的m_dwRef成员上成员上lCComObjectRootEx定义了一把锁定义了一把锁 锁的类型为锁的类型为AutoCriticalSection 对锁的封装对锁的封装ObjectLock,wrapperl用于未被聚合的情况下用于未被聚合的情况下lTable-driven QueryInterfacelInterface MapBEGIN_COM_MAP(class) COM_INTERFACE_ENTRY(itf)END_COM_MAPl表中每一项表中每一项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决定这个决定这个COM对象如何被分配,是否被聚合等对象如何被分配,是否被聚合等l区别:区别: 线程模型是以每个类为基础的,线程模型是以每个类为基础的,per-class,可以封装到基类中,可以封装到基类中 对象的生命周期和身份标识是以每个对象实例为基础的,对象的生命周期和身份标识是以每个对象实例为基础的,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两个步骤:两个步骤: 使用使用CRT的构造器的构造器 FinalConstructl对应于对应于FinalConstruct有有FinalReleasel举例:举例
49、:CMyClassFactory:CreateInstance() CComObject *pObj = new CComObject;.pObj-InternalFinalConstructAddRef();HRESULT hr = FinalConstruct();pObj-InternalFinalConstructRelease();l每个每个creator类有一个静态类有一个静态CreateInstance函数:函数: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 根据根据pv参数是否为参数是否
51、为null从两个对象类中择一从两个对象类中择一 CComFailCreator 假的创建类假的创建类l在在CMyObject类中定义一个类型类中定义一个类型_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) / 调用调用 OuterQueryInterface(iid, ppvObject); IUnknown* GetControllingUnknown() ;/ CComObjectRootBase基类中联合成员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实现结构实现结构 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项项 要求每个类都要提供要求每个类都要提供UpdateRegistry成员成员 宏:宏: DECLARE_NO_REGISTRY() DECLARE_REGISTRY(class, pid, vpid, nid, flags) DECLARE_REGISTRY_RESOURCE(x) DECLARE_REGISTRY_RESOURCEID(x)l缺省生成的工程使用资源进行注册缺省生成的工程使用资源进行注册 Registry Script FilelOBJECT_ENTRY宏包含:宏包含:class:_ClassFactoryCreatorClass:CreateInstancelDECLARE_CLASSFACTORY_EX宏定
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物业酬金制服务合同范本
- 高档消费品买卖合同范本
- 高龄员工家属免责协议书
- 煤矿托管合同协议书范本
- 自动生鲜车购买合同范本
- 烘焙店加盟合同协议范本
- 深圳市拆迁协议合同模板
- 银行解除合同协议书范本
- 网店服装合伙人合同协议
- 煤矿股权出让协议书范本
- 保险公司分享高客市场开拓与经营课件
- 2021年睢宁县教师进城考试笔试试题及答案解析
- 植保生物制品的工厂化天敌昆虫产业化生产基地可行性研究报告
- 青蓝工程指导教师(师傅)个人工作总结
- 超级玛丽像素风教学班会PPT模板
- 《兽药经营许可证》培训记录
- 住宿酒店商务宾馆品质服务体验管理 酒店工程验收标准-模版PPT
- 离散数学英文讲义:1-3 Predicates and Quantifiers
- 一个国王地爱情故事英文版
- 管道支架重量计算表(计算支架)
- 党支部委员会书记选票
评论
0/150
提交评论