04_Com实现.ppt
《04_Com实现.ppt》由会员分享,可在线阅读,更多相关《04_Com实现.ppt(78页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、COM实现实现潘爱民http:/ class IUnknown IUnknown public:public:virtual HRESULT_virtual HRESULT_stdcall QueryInterfacestdcall QueryInterface(const IID&const IID&iidiid,void*,void*ppvppv)=0;)=0;virtual ULONGvirtual ULONG _ _stdcall AddRefstdcall AddRef()=0;()=0;virtual ULONGvirtual ULONG _ _stdcall stdcall Re
2、lease()=0;Release()=0;COM接口结构接口结构COM接口引用计数接口引用计数vv引用计数的含义Outstanding referenceOutstanding referencevv对象实现引用计数AddRefAddRef、ReleaseReleasevv客户显式地操纵引用计数客户有责任维护好引用计数客户有责任维护好引用计数vv引用计数规则COM接口接口QueryInterfaceHRESULT _HRESULT _stdcall QueryInterfacestdcall QueryInterface(const IID&const IID&iidiid,void*,vo
3、id*ppvppv)vv一个COM对象可以实现多个接口QueryInterfaceQueryInterface是技术保证是技术保证vvQueryInterface实现多继承情况:使用多继承情况:使用static_caststatic_cast向上转换向上转换对象身份:对象身份:IUnknownIUnknown必须唯一必须唯一vv客户通过QueryInterface使用对象的接口注意:注意:QueryInterfaceQueryInterface内含内含AddRefAddRefCOM对象的标识对象的标识CLSIDvv是GUID的一种用法vv创建对象的时候必须要提供CLSIDvvCOM对象的身份身
4、份是否一致的可判断性身份是否一致的可判断性COM对象与对象与C+对象的比较对象的比较vv层次差异vv封装特性vv可重用性vv多态性的表现形式不同COM对象和接口图示对象和接口图示COM对象对象vv客户的交互实体vv包括属性和方法,或者状态和操作vv能够提供服务通过COM接口vv对象的实现由组件完全包装起来接口描述语言:接口描述语言:IDLinterface interface IDictionaryIDictionary:IUnknownIUnknown HRESULT Initialize();HRESULT Initialize();HRESULT HRESULT LoadLibraryL
5、oadLibrary(in string);(in string);HRESULT HRESULT InsertWordInsertWord(in string,in string);(in string,in string);HRESULT HRESULT DeleteWordDeleteWord(in string);(in string);HRESULT HRESULT LookupWordLookupWord(in string,out string*);(in string,out string*);HRESULT HRESULT RestoreLibraryRestoreLibra
6、ry(in string);(in string);HRESULT HRESULT FreeLibraryFreeLibrary();();vvMIDLMIDL可以由可以由IDLIDL文件生成文件生成C/C+C/C+接口描述接口描述IDL简介简介vv以OSF IDL为基础vv基本数据类型与与C C语言非常接近,包括结构、联合、枚举、语言非常接近,包括结构、联合、枚举、typedeftypedef等等vvinterfacevvcoclassvvlibrary可以产生类型库可以产生类型库IUnknown接口的接口的IDL描述描述vvIDLIDL接口定义:接口定义:local,object,loca
7、l,object,uuiduuid(00000000-0000-0000-C000-000000000046),(00000000-0000-0000-C000-000000000046),pointer_default(unique)pointer_default(unique)interface interface IUnknownIUnknown typedeftypedef unique unique IUnknownIUnknown*LPUNKNOWN;*LPUNKNOWN;HRESULT HRESULT QueryInterfaceQueryInterface(in REFIID(
8、in REFIID riidriid,out,out,iidiid_is(_is(riidriid)void*)void*ppvObjectppvObject););ULONG ULONG AddRefAddRef();();ULONG Release();ULONG Release();IDL中类的描述中类的描述 uuiduuid(1e196b20-1f3c-1069-996b-00dd010fe676),(1e196b20-1f3c-1069-996b-00dd010fe676),version(1.0),version(1.0),helpstringhelpstring(A class)
9、,(A class),helpcontexthelpcontext(2481),(2481),appobjectappobject coclass myapp coclass myapp source interface source interface IMydocfuncsIMydocfuncs:IUnknownIUnknown;dispinterface DMydocfuncsdispinterface DMydocfuncs;IDL中库的描述中库的描述 uuiduuid(12345678-1234-1234-1234-123456789ABC),(12345678-1234-1234-
10、1234-123456789ABC),helpstringhelpstring(Hello 2.0 Type Library),(Hello 2.0 Type Library),lcidlcid(0 x0409),(0 x0409),version(2.0)version(2.0)library Hello library Hello /*Library definition statements*/*Library definition statements*/;IDL中中library示例示例 object,uuid(.),interface IKnown:IUnknown import
11、unknwn.idl;library KnownLibrary /reference interface IKnown:interface IKnown;/or create a new class:coclass KnowMore interface IKnown;IDL的意义的意义vvIDL语言无关跨语言的中间语言跨语言的中间语言vvMIDL.exe产生C+头文件定义相当于相当于C+C+定义定义vvMIDL.exe产生TLB类型库COMCOM本身提供了一套基础设施来解释类型库本身提供了一套基础设施来解释类型库vv所有的标准接口都可以在SDK中找到IDL描述编译编译IDLxxx.IDL文件M
12、IDL.exexxx.h C+头文件xxx_i.c GUIDxxx_p.c P/Sdlldata.cxxx.tlb用于客户/服务器proxy/stub用于其他编程语言,如Java、VBCOM对象实现形式对象实现形式vv进程内组件in process componentin process componentvv进程外组件out of process componentout of process component进程内组件进程内组件vv组件:做成DLL引出函数vv客户:用到的用到的APIAPI函数,函数,LoadLibraryLoadLibrary、GetProcAddressGetProc
13、Address、FreeLibraryFreeLibraryvv说明:1.1.也可以引出全局变量也可以引出全局变量2.2.DumpBinDumpBin检查组件的引出函数和变量检查组件的引出函数和变量进程外组件进程外组件vv实现形式:EXEvvIPC:DDE、消息机制、共享内存、RPC/LPC等等vv例:应用调用系统服务进程外组件进程外组件(续续)回顾:对象与客户之间的连接回顾:对象与客户之间的连接vv客户通过vtable与对象进行通信vv客户如何获得第一个接口指针?CreateStringCreateString引出函数引出函数vv如何创建(create)?激活(activate)?vv创建工
14、作一定是由组件中的一个函数来完成:创建函数CreateObjectvv客户如何访问这个函数?创建函数创建函数vv方案1直接引出创建函数直接引出创建函数优点:对于优点:对于DLLDLL非常方便非常方便vv方案2把创建函数封装到一个对象中,通过把创建函数封装到一个对象中,通过vtablevtable调用调用优点:灵活,客户以一致的方式调用创建函数优点:灵活,客户以一致的方式调用创建函数创建函数创建函数(续续)客户组件创建函数指针客户组件创建函数指针创建函数所在的对象创建函数所在的对象vv该对象被称为类对象,也称为类厂vv现在问题是:如何创建类厂对象?对于对于DLLDLL通过引出函数通过引出函数对于
15、对于EXEEXE,EXEEXE的引出函数?的引出函数?vv客户-引出函数-类厂对象-用户对象vv引出函数的名字固定:DllGetClassObjectvv增加了一层间接性,带来灵活性创建对象结构示意图创建对象结构示意图客户组件创建实例对象DllGetClassObject创建类厂对象类厂类厂(Class Factory)vv类厂:用于创建COM对象的COM对象vv目标:完成COM对象的创建过程,更好地把客户与对象隔离开来。vv特殊性:实现一个或多个创建接口,缺省的接口为实现一个或多个创建接口,缺省的接口为IClassFactoryIClassFactory类厂本身没有类厂本身没有CLSIDCL
16、SID类厂类厂(续续)vv类厂与COM对象有一一对应关系创建类厂对象创建类厂对象vvDllGetClassObject创建类厂对象创建类厂对象需要哪些信息?创建类厂对象需要哪些信息?vvDllGetClassObject原型:HRESULT HRESULT DllGetClassObjectDllGetClassObject(const CLSID&const CLSID&clsidclsid,const IID&const IID&iidiid,(void*)(void*)ppvppv););创建函数需要哪些信息?创建函数需要哪些信息?vvclsid与类厂绑在一起与类厂绑在一起vviid客户
17、提供客户提供vv结果接口指针类型取决于类型取决于iidiidIClassFactory接口接口class class IClassFactoryIClassFactory:public :public IUnknownIUnknown virtual HRESULT _virtual HRESULT _stdcall CreateInstancestdcall CreateInstance(IUnknownIUnknown*pUnknownOuterpUnknownOuter,const IID&const IID&iidiid,void*void*ppvppv)=0;)=0;virtual
18、HRESULT _virtual HRESULT _stdcall LockServerstdcall LockServer(BOOL BOOL bLockbLock)=0;)=0;小结:客户创建对象过程小结:客户创建对象过程vv客户提供信息组件位置、组件位置、clsidclsid、iidiid、结果接口指针地址结果接口指针地址ppvppvvv过程:根据组件位置,根据组件位置,LoadLibraryLoadLibraryGetProcAddressGetProcAddress,获取获取DllGetClassObjectDllGetClassObject用用clsidclsid和和IID_IID
19、_IClassFactoryIClassFactory获得类厂对象接口获得类厂对象接口指针指针pFactorypFactory用用iidiid、ppvppv调用调用pFactorypFactory-CreateInstanceCreateInstance创建过程的位置透明性创建过程的位置透明性vv位置透明性可以极大地方便客户程序vv如何做到位置透明性?在当前环境下,每个在当前环境下,每个clsidclsid必定与某个组件相必定与某个组件相联系联系如何从如何从clsidclsid映射到组件位置?映射到组件位置?vv解决方案:维护维护clsidclsid与组件位置的映射关系与组件位置的映射关系在客
20、户与组件之间插入中介在客户与组件之间插入中介COM方案方案vv在Windows平台上,使用系统注册表保存映射关系,所以,从clsid可以找到对应组件的位置vv在客户与组件之间插入COM库,由COM库完成创建的细节工作Windows系统注册表系统注册表vv树状结构根是根是“My Computer”My Computer”预定义的预定义的5 5个子节点个子节点HKEY_CLASSES_ROOTHKEY_CLASSES_ROOTvv为为HKEY_LOCAL_MACHINEHKEY_LOCAL_MACHINE的一个子节点的一个子节点HKEY_CURRENT_USERHKEY_CURRENT_USERv
21、v为为HKEY_USERSHKEY_USERS的一个子节点的一个子节点HKEY_LOCAL_MACHINEHKEY_LOCAL_MACHINEHKEY_USERSHKEY_USERSHKEY_CURRENT_CONFIGHKEY_CURRENT_CONFIG通过注册表管理通过注册表管理COM对象对象vvHKEY_CLASSES_ROOTCLSIDTreeView组件的注册信息组件的注册信息回顾:回顾:COM对象的标识对象的标识vvCLSIDCLSID,两种形式两种形式 128128位整数,随机数,不需要运算功能,但是需要比位整数,随机数,不需要运算功能,但是需要比较和查找功能较和查找功能 字符
22、串形式字符串形式例如例如:72:72d3edc2-a4c4-11d0-8533-00c04fd8d503d3edc2-a4c4-11d0-8533-00c04fd8d503vvProgIDProgID:友好名,字符串形式友好名,字符串形式 有可能重名,用一种约定来避免重名有可能重名,用一种约定来避免重名 例如:例如:Word.DocumentWord.Document 包含版本:包含版本:Word.Document.8Word.Document.8TreeControl的的ProgID信息信息注册表其他事项注册表其他事项vv系统全局的注册信息、公共信息仓库vv工具RegEdit.exe、Reg
23、edt32、OLEViewvv程序访问途径:Win32 APIvvComponent Categories(组件类别)组件类别组件类别COM组件的注册组件的注册vv进程内组件 两个引出函数两个引出函数DllRegisterServerDllRegisterServer和和DllUnregisterServerDllUnregisterServer注册工具:注册工具:RegSvr32.exeRegSvr32.exe例如:例如:RegSvr32 c:RegSvr32 c:DictCompDictComp DictCompDictComp.dlldllRegSvr32 /u c:RegSvr32 /
24、u c:DictCompDictComp DictCompDictComp.dlldllvv进程外组件 命令行参数命令行参数/RegServerRegServer和和/UnregServerUnregServerCOM库库vv创建过程COMCOM库处于库处于COMCOM组件和客户中间组件和客户中间vv调用过程对于进程内组件,对于进程内组件,COMCOM库不再参与处理库不再参与处理COM对象创建过程对象创建过程客户组件COM创建函数COM库DllGetClassObject类厂对象接口指针COM创建函数创建函数vvCOM库中三个用于创建组件的函数:CoGetClassObjectCoGetCla
25、ssObjectCoCreateInstanceCoCreateInstanceCoCreateInstanceExCoCreateInstanceExCoGetClassObjectvv创建一个类厂HRESULT HRESULT CoGetClassObjectCoGetClassObject(const CLSID&const CLSID&clsidclsid,DWORD DWORD dwClsContextdwClsContext,COSERVERINFO *COSERVERINFO *pServerInfopServerInfo,const IID&const IID&iidiid,(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 04 _Com 实现
限制150内