C++类的链接 nking 在完成 CMyString类的编写后,用户可采 用两种编译连接方式: 静态链接 许多类库的做法 在编译时刻链接 ■静态链接的缺点 代码重复:多个程序各有自己的代码,需要更 多的内存 客户程序占据更多的外存空间 n库代码更新需要重新编译所有的客户程序
C++类的链接linking ◼ 在完成CMyString类的编写后,用户可采 用两种编译连接方式: ◼ 静态链接 ◼ 许多类库的做法 ◼ 在编译时刻链接 ◼ 静态链接的缺点 ◼ 代码重复:多个程序各有自己的代码,需要更 多的内存 ◼ 客户程序占据更多的外存空间 ◼ 库代码更新需要重新编译所有的客户程序
C++类的链接nkng(续) #ifdef MYSTRINgDli #define EXPORTORIMPORT declspec(dllexport) #el #define EXportorimport declspec(dllimport) #endif 动态链接 在运行时链接 class eXPORTORIMPORT CMyString /导出或导进 ■动态链接形式 private char*m psz 编译时刻通过引入库pblo 运行时刻完全动态 CMy String(const char* psz); CMyStringO 存在DHe!风险 const char*Find(const char *psz) int Length
C++类的链接linking(续) ◼ 动态链接 ◼ 在运行时链接 ◼ 动态链接形式 ◼ 编译时刻通过引入库 ◼ 运行时刻完全动态 ◼ 存在Dll Hell风险 #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(); };
C++接口如何走向COM接口 动态链接符合COM的需要 C++中类形式的接口存在的问题
C++接口如何走向COM接口 ◼ 动态链接符合COM的需要 ◼ C++中类形式的接口存在的问题
COM接口 概念:函数集,以二进制的形式给出了从 方到另一方的调用规范,或者: coM接口是一个包含一个函数指针数组的内 存结构,每一个数组元素包含的是一个由组 件实现的函数的地址。 接口标识—IID IUnknown ■CoM接口采用二进制结构
COM接口 ◼ 概念:函数集,以二进制的形式给出了从一 方到另一方的调用规范,或者: ◼ COM接口是一个包含一个函数指针数组的内 存结构,每一个数组元素包含的是一个由组 件实现的函数的地址。 ◼ 接口标识——IID ◼ IUnknown ◼ COM接口采用二进制结构
COM接口的标识ID sGUD的一种用法 GUID是一个128位的长整数 ■产生规则保证了唯一性 例子:54BF65671007-1101044415359000 C语言结构和定义: typedef struct_GUID t DWORd Datal extern const GUID WORd Data2. CLSID MYSPELLCHECKER WORd Data3 {0x54b6567,0X1007,0X1ldl BYTE Data4[8] {0xb0,0xaa,Ox44,Ox45,0x53 0x54,0x00,0X00}} 3 GUID
COM接口的标识——IID ◼ 是GUID的一种用法 ◼ GUID是一个128位的长整数 ◼ 产生规则保证了唯一性 ◼ 例子:{54BF6567-1007-11D1-B0AA-444553540000} ◼ C语言结构和定义: typedef struct _GUID { DWORD Data1; WORD Data2; WORD Data3; BYTE Data4[8]; } GUID; extern "C" const GUID CLSID_MYSPELLCHECKER = { 0x54bf6567, 0x1007, 0x11d1, { 0xb0, 0xaa, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00} } ;