《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接口的支持。