本文共 1052 字,大约阅读时间需要 3 分钟。
《COM原理与应用》笔记
COM对象往往有自己的属性数据,这些属性数据反映了对象的状态,正是通过这些属性数据,反映了此对象与彼对象的不同。例如,字典对象有一个字典数据表m_pData成员和字典文件名m_DictFilename作为其基本的属性数据。用C++语言来实现字典对象:
class CDictionary : public IDictionary { public: CDictionary(); ~CDictionary(); virtual BOOL Initialize(); virtual BOOL LoadLibrary(String); virtual BOOL InsertWord(String, String); virtual void DeleteWord(String); virtual BOOL LookupWord(String, String *); virtual BOOL RestoreLibrary(String); virtual void FreeLibrary(); private: struct DictWord *m_pData; char *m_DictFilename[128]; }; 按照类CDictionary的定义,接口IDictionary和字典对象的内存结构变成图2.4。如果一个客户使用了两个字典对象,则显然两个字典对象公用了成员函数,但数据属性是不能公用的,根据C++中class的基本编译原理,这时内存结构如图2.5所示。
如果第二个字典组件对象没有采用CDictionary类的结构来实现其字典功能,但也实现了IDictionary接口,则此时内存结构与图2.5又有所不同,如图2.6所示。
以上给出的三个模型图中,每个接口成员函数都包含一个this指针,通过该this指针,接口成员函数可以访问到字典对象的属性数据。按照CDictionary的定义方法,该this指针指向CDictionary类的对象,因此,在虚函数中可以直接访问CDictionary的数据成员。
实际上,也可以采用其他的方法来实现接口,只要接口成员函数中this指针(接口指针)与对象数据能建立确定的连接,在接口成员函数中可以访问到对象数据即可。例如MFC和ATL分别采用了不同的机制来提供对COM接口的支持。
转载地址:http://ypsli.baihongyu.com/