读书人

当接口种中如果成员变量 的时候是否

发布时间: 2012-11-20 09:55:43 作者: rapoo

当接口类中如果成员变量 的时候,是否会对com 产生了影响?
当接口类中如果成员变量 的时候,是否会对com 产生了影响?


我们知道, com是最终发布后,提供给用户的,则是:

用户根据接口指针来获得虚函数表指针。

当时,如果接口中插入数据后,那么会如何呢?

举例:

strcut A:public IUnkown
{
虚函数1
虚函数2
int a;
虚函数3;
};



strcut B:public IUnkown
{
虚函数1
虚函数2
int b;
虚函数3;
};


struct C:public A, public B
{

对6个虚函数的实现
};


由于采用多重继承,已经消去了虚基类表指针, 但是有意在接口A,B中插入数据。

是否会对 com产生了影响?




以上的例子,当没有在接口中插入成员变量的时候,其内部布局如下:


虚函数表A地址
虚函数表B地址


插入成员变量后,内存布局为多少?





[解决办法]

探讨
这几个问题和 dll hell对比 可以发现:

com在使用方面,是不能够,不允许用接口指针直接去访问变量的。

1. idl文件中的变量类型和 终极派生类中的属性 类型是不一样的

比如:在接口中增加一个BSTR 的, 但是在终极派生类中增加一个CComBSTR 与其对应。

所以com是不允许使用接口指针访问 属性的


2. 当你发布的 com的,接口数目不变(指的是:假设有2个接口,那么尽管修改了这2个接口,但是接口数目还是2个),一旦改变了,比如:再增加一个新的接口,那么这个com 供给用户 的时候,就会引起

dll hell来。 新接口有虚函数表。 老的exe里却不知道,所以无法使用新接口。

就必须重新编译生成exe

读书人网 >C++

热点推荐