COM实现 潘爱民 http:/www.icst.pku.edu.cn/compcourse
COM实现 潘爱民 http://www. http://www.icst.pku.edu.cn/compcourse compcourse
组作接口 第一个里程 用tabe作为接口 解决了名字冲突和二进制结构兼容问题 第二个里程碑 接口转换: Dynamic_cast 第三个里程碑 管理对象生命周期:引用计数
组件接口 !第一个里程碑 – 用vtable作为接口 – 解决了名字冲突和二进制结构兼容问题 解决了名字冲突和二进制结构兼容问题 !第二个里程碑 – 接口转换:Dynamic_cast Dynamic_cast !第三个里程碑 – 管理对象生命周期:引用计数 管理对象生命周期:引用计数
cOM接口 接国标识:ID class iunknown public: virtual HRESULT stdcall QueryInterface( const IID& id, void **ppv)=0 virtual ULONG stdcall AddRef(=0 virtual ULONG stdcall Released=0
COM接口 ! 接口标识:IID ! IUnknown IUnknown接口: class IUnknown IUnknown { public: public: virtual HRESULT__ virtual HRESULT__stdcall QueryInterface stdcall QueryInterface( const IID& const IID& iid, void ** , void **ppv) = 0 ; ) = 0 ; virtual ULONG virtual ULONG __stdcall AddRef stdcall AddRef() = 0; () = 0; virtual ULONG virtual ULONG __stdcall stdcall Release() = 0; Release() = 0; };
cOM接口结构 pOtable vtable 接口指针 指针 指针函数1 指针函数2 对象实现 指针函数3
COM接口结构 接口指针 指针 指针函数 1 指针函数 2 指针函数 3 。。。。。。 对象实现 pVtable vtable
c0M接囗引用计数 用计数的含义 Outstanding reference 对象实现引用计数 Addref、 Release 客卢显式地操纵引用计数 客户有责任维护好引用计数 今引用计数规则
COM接口引用计数 !引用计数的含义 引用计数的含义 – Outstanding reference Outstanding reference !对象实现引用计数 对象实现引用计数 – AddRef、Release Release !客户显式地操纵引用计数 客户显式地操纵引用计数 – 客户有责任维护好引用计数 客户有责任维护好引用计数 !引用计数规则
cO》接口 QueryInterface HRESULT stdcall QueryInterface( const IID& id, void*ppv 个COM对象可以实现多个接口 QueryInterface是技术保证 Queryinterface实现 多继承情况:使用 static cast向上转换 三对象身份: IUnknown必须唯 客户通过 QueryInterface使用对象的接口 注意: QueryInterface内含 AddRef
COM接口QueryInterface QueryInterface HRESULT __ HRESULT __stdcall QueryInterface stdcall QueryInterface( const IID& const IID& iid, void ** , void **ppv) !一个COM对象可以实现多个接口 对象可以实现多个接口 – QueryInterface QueryInterface是技术保证 !QueryInterface QueryInterface实现 – 多继承情况:使用 多继承情况:使用static_cast static_cast向上转换 – 对象身份:IUnknown IUnknown必须唯一 !客户通过QueryInterface QueryInterface使用对象的接口 使用对象的接口 – 注意:QueryInterface QueryInterface内含AddRef
TDL 少类C的语言,但不是编程语言 跨语言的中间语言 编译器: MIDL exe产生C++头文件定义 产生C++头文件定义,相当于C+定义 MIDL,eXe产生TB类型库 许多编程语言利用COM对∏LB的支持 氵所有的标准接口都可以在SDK中找到IDL描述 支持 Import/importlib语法
IDL !类C的语言,但不是编程语言 的语言,但不是编程语言 – 跨语言的中间语言 跨语言的中间语言 !编译器:MIDL.exe MIDL.exe产生C++头文件定义 – 产生C++头文件定义,相当于 头文件定义,相当于C++定义 !MIDL.exe MIDL.exe产生TLB类型库 – 许多编程语言利用 许多编程语言利用COM对TLB的支持 !所有的标准接口都可以在 所有的标准接口都可以在SDK中找到IDL描述 – 支持import/ import/importlib importlib语法