c0M接口与对象 潘爱民 panaimin@icst.pku.edu.cn
COM接口与对象 潘爱民 panaimin panaimin@icst.pku.edu.cn
内 组件的接口 COM接口 COM IDL 冷COM对象
内容 !组件的接口 !COM接口 !COM IDL COM IDL !COM对象
从历史看CoM 次COM产生的背景 93年因为OLE2的需要而产生 OLE1的缺 冷COM又从OLE中脱颖而出 COM的优势不限于OLE COM成为 Microsoft跟上 Interne的 项重要基础技术 冷今天的 Windows平台上,COM无 处不在
从历史看COM !COM产生的背景 – 93年因为OLE 2的需要而产生 – OLE 1的缺陷 !COM又从OLE中脱颖而出 – COM的优势不限于OLE – COM成为Microsoft Microsoft跟上Internet Internet的 一项重要基础技术 一项重要基础技术 !今天的Windows Windows平台上,COM无 处不在
cOM基础——一几个概念 之COM组件 可独立发布的二进制组件 在WndW平台上为DL或者EXE COM对象 通过COM接口提供服务 符合00中对象的基本概念 COM接口 客户与对象之间的协议,对象实 现COM接口,客户使用COM接口
COM基础——几个概念 !COM组件 – 可独立发布的二进制组件 可独立发布的二进制组件 – 在Windows Windows平台上为DLL或者EXE !COM对象 – 通过COM接口提供服务 – 符合OO中对象的基本概念 中对象的基本概念 !COM接口 – 客户与对象之间的协议,对象实 客户与对象之间的协议,对象实 现COM接口,客户使用 接口,客户使用COM接口
如何设计? cOM组件 为方便起见,只讨论 Windows平台 上DLL类型的组件 COM对象 如何标识一个对象?对象以什么形式 存在?客户如何创建对象? 对象如何暴露接口?一个或是多个? 冷COM接口 要求:跨编译器、跨语言、跨平台
如何设计? !COM组件 – 为方便起见,只讨论 为方便起见,只讨论Windows Windows平台 上DLL类型的组件 !COM对象 – 如何标识一个对象?对象以什么形式 如何标识一个对象?对象以什么形式 存在?客户如何创建对象? 存在?客户如何创建对象? – 对象如何暴露接口?一个或是多个? 对象如何暴露接口?一个或是多个? !COM接口 – 要求:跨编译器、跨语言、跨平台 要求:跨编译器、跨语言、跨平台
设讲cOM接口—一从C++入手 C++类;接口与实现的分离 接口类的pc部分 class Cmystring rivate char "m psz, public CMy String(const char*psz) CMyString0 const char* Find( const char psz) int Length(
设计COM接口——从C++入手 !C++类:接口与实现的分离 类:接口与实现的分离 – 接口:类的public部分 class CMyString { private: char *m_psz; public: CMyString(const char * psz); ~CMyString(); const char*Find(const char *psz); int Length(); };
设计cOM接口一从C++入手续) C++类的实现 CMy String: CMy String( const char* psz) m psz new charlpsz strlen(psz)+1: ID( strcpy(m psz, psz) else CMy String: CMyString0 deletel m const char*CMyString Find( const char psz) return strstr(m psz, psz) int CMyString: Length i return strlen(m psz)
设计COM接口——从C++入手(续) !C++类的实现 CMyString::CMyString(const char * psz) : m_psz( new char[psz ? strlen(psz)+1 :1]) { if ( psz ) strcpy(m_psz,psz); else m_psz[0] = 0; } CMyString::~CMyString() { delete [] m_psz; } const char*CMyString::Find(const char *psz) { return strstr(m_psz,psz); } int CMyString::Length() { return strlen(m_psz); }
c+类的链接 linking 之静态链接 一许多类库的做法 编译时刻的链接 静态链接的缺点 代码重复:多个程序各有自己的 代码,需要更多的内存 客户程序占据更多的外存空间 库代码更新需要重新编译所有的 客户程序
C++类的链接linking linking !静态链接 – 许多类库的做法 许多类库的做法 – 编译时刻的链接 编译时刻的链接 !静态链接的缺点 静态链接的缺点 – 代码重复:多个程序各有自己的 代码重复:多个程序各有自己的 代码,需要更多的内存 代码,需要更多的内存 – 客户程序占据更多的外存空间 客户程序占据更多的外存空间 – 库代码更新需要重新编译所有的 库代码更新需要重新编译所有的 客户程序
c+类的链接 linking(续) #ifdef MYSTRINGDLL #define EXPORTORIMPort declspec( dllexport #else #define EXPORTORIMPORT declspec(dllimport #endif 动态链接 运行时刻的链接 class eXportorimPort CMy string 动态链接形式 private char *m 编译时刻通过引入库ptc CMyString( const char * psz) 一运行时刻完全动态 CMyStringO const char*Find( const char *psz); int Length };
C++类的链接linking( linking( 续 ) !动态链接 – 运行时刻的链接 运行时刻的链接 !动态链接形式 – 编译时刻通过引入库 编译时刻通过引入库 – 运行时刻完全动态 运行时刻完全动态 #ifdef MYSTRINGDLL #define EXPORTORIMPORT _declspec(dllexport) #else #define EXPORTORIMPORT _declspec(dllimport) #endif class EXPORTORIMPORT CMyString { private: char *m_psz; public: CMyString(const char * psz); ~CMyString(); const char*Find(const char *psz); int Length(); };
cH接口如何走向COM接囗 动态链接符合COM的需 C++中类形式的接口存在的问题 客户看到了什么? 若用 Visual o+5.0/6.0编译器 ??0CMy String@aQAEaPBDaz ? 1CMyString@@QAE@XZ Find(@CMy String@@QAEPBDPBD@Z ?Length@CMy String@@QAEHXZ
C++接口如何走向COM接口 !动态链接符合COM的需要 !C++中类形式的接口存在的问题 中类形式的接口存在的问题 – 客户看到了什么? 客户看到了什么? – 若用Visual C++ 5.0/6.0 Visual C++ 5.0/6.0编译器 ??0CMyString@@QAE@PBD@Z ??1CMyString@@QAE@XZ ?Find@CMyString@@QAEPBDPBD@Z ?Length@CMyString@@QAEHXZ