关于COM对象的QueryInterface在C++兑现中通过强制转换对象的this指针的对应的接口指针的疑惑
关于COM对象的QueryInterface在C++实现中通过强制转换对象的this指针的对应的接口指针的疑惑?
到现在没搞明白,例如:假如一个COM对象MyCom通过纯虚函数方式继承接口IA与接口IB,资料上讲通过CLSID与IA接口IID使用CoCreateInstance函数可获得IA的接口指针,而MyCom对象的内存形式是MyCom的This指针指向的是:IA的Vtable指针,依次
为IB的Vtable指针,MyCom对象的属性数据.而C++实现的QueryInterface中通过(IA *)This得到接口IA的指针,而(IB *)This即得到接口IB的指针,明明This指针指向的是IA的Vtable指针,怎么一强制转换后能变成指向接口IB的指针(即IB的Vtable指针,它是位于This+4(byte)的位置上啊),是C++有这样的规则吗,强制转换能实现上述内存指针变换,有哪本书上有介绍吗??
期盼解答中...
------解决思路----------------------
据我所知,一个COM类中如果包含多个Interface,
可以通过QueryInterface来查询里面的n个接口的指针
事实上只是前面的那个接口标识符来区别的 比如IID_IInterfaceA ,IID_IInterfaceB分别对应A接口,和B接口。
------解决思路----------------------
C++有这样的规则,我也是看了<COM技术内幕>才知道的。
试一试就知道了:(下面代码显示pB的地址是pA+4)
到现在没搞明白,例如:假如一个COM对象MyCom通过纯虚函数方式继承接口IA与接口IB,资料上讲通过CLSID与IA接口IID使用CoCreateInstance函数可获得IA的接口指针,而MyCom对象的内存形式是MyCom的This指针指向的是:IA的Vtable指针,依次
为IB的Vtable指针,MyCom对象的属性数据.而C++实现的QueryInterface中通过(IA *)This得到接口IA的指针,而(IB *)This即得到接口IB的指针,明明This指针指向的是IA的Vtable指针,怎么一强制转换后能变成指向接口IB的指针(即IB的Vtable指针,它是位于This+4(byte)的位置上啊),是C++有这样的规则吗,强制转换能实现上述内存指针变换,有哪本书上有介绍吗??
期盼解答中...
------解决思路----------------------
据我所知,一个COM类中如果包含多个Interface,
可以通过QueryInterface来查询里面的n个接口的指针
事实上只是前面的那个接口标识符来区别的 比如IID_IInterfaceA ,IID_IInterfaceB分别对应A接口,和B接口。
------解决思路----------------------
C++有这样的规则,我也是看了<COM技术内幕>才知道的。
试一试就知道了:(下面代码显示pB的地址是pA+4)
- C/C++ code
struct IA{ virtual void Afunc() = 0; }; struct IB{ virtual void Bfunc() = 0; }; struct IMyComm:IA,IB{ }; //实现 struct CMyComm:IMyComm{ virtual void Afunc(){;} virtual void Bfunc(){;} }; void __fastcall TForm1::Button1Click(TObject *Sender) { IMyComm *pMyComm = new CMyComm; IA *pA = pMyComm; IB *pB = pMyComm; ShowMessage(AnsiString().sprintf("pMyComm Addr:\t%X\npA Addr:\t%X\npB Addr:\t%X",pMyComm,pA,pB)); }