使用COM的解决1是什么2在哪里这两个问题

QueryInterface的实现规则
1 QueryInterface返回的总是同一IUnknown指针
2 若客户曾经获得过某个接口。那么它将总能获得此接口
3 客户可以再次获得已经拥有的接口
4 客户可以返回到起始接口
5 若能够从某个接口获得某特定接口,那么可以从任意接口都将可以获得此接口

当改变了下列条件中的任何一个时,就应该给新接口指定新的ID
接口中函数的数目;
接口中函数的顺序;
某个函数的参数;
某个函数参数的顺序;
某个函数参数的类型;
函数可能的返回值;
函数返回值的类型;
函数参数的含义;
接口中函数的含义;

为正确地使用引用计数,读者需要了解以下三条简单的规则:
1 在返回之前调用AddRef。对于那些返回接口指针的函数,在返回之前应用相应的指针调用AddRef。
  这些函数包括QueryInterface及CreateInstance。这样当客户从这种函数得到一个接口后,它将无需调用AddRef。
2 使用完接口之后调用Release。在使用完某个接口之后应调用此接口的Release函数。
3 在赋值之后调用AddRef。在将一个接口指针赋给另外一个接口指针时,应调用AddRef。换句话说,在建立接口的
  另外一个引用之后应增加相应组件的引用计数。

在客户可以获得某个组件接口指针之前,它必须先将相应的DLL装载到其进程空间中并创建此组件。第3章中给出
的CreateInstance可以建立一个组件的实例并给客户返回一个IUnKnown接口指针。这是DLL中唯一需要客户
显式链接的函数。
注意:在函数的定义前加上extern "C"可防止C++编译器在函数名称上加上类型信息。对此并没有什么标准,因此变换以后的
函数是不可移植的。并且对这种变换以后的名称处理起来也非常困难。当然从DLL中输出函数仅仅是将函数加上extern"C"标记是
不够的,还需要告诉链接程序需要输出什么函数。为此,需要建立一个“讨厌”的DEF函数。

一个接口实际上是一个指向函数的指针列表(vtbl)。组件将为ctbl分内存并用每一个函数的地址来初始化此表格。
为使用vtbl,客户应该能够访问组件为其vtbl所分配的内存。同时它还必须能够理解组件放入到vtbl中的各个地址。在
windows中,由于动态链接库与客户使用的是同一地址空间,因此客户访问vtbl是不成问题的。

类厂所支持的用于创建组件的标准接口是IClassFactory。大多数组件均可使用IClassFactory接口来创建。此
接口的声明如下:
interface IClassFactory:IUnknown
{
HRESULT stdcall CreateInstace(IUnknown* pUnknownOuter,const IID& iid,void** ppv);
HRESULT  stdcall  LokServer(BOOL bbLock);
}

只要能记住类厂不过是创建其他组件的一个简单组件,那么对类厂的理解将会容易得多。
与某个特定CLSIDxiangying的类厂将是由实现组件的开发人员实现的。大多数情况下,类厂组件包含在与它所创建的
组件相同的DLL中。

即使当我们在几个不同的组件之间共享类厂的代码时,类厂的一个实例也仅能创建同某个CLSID相应的组件。类厂实例同CLSID
之间的对应将永远是一对一的。ICLssFactory::CreateInstance不接收CLSID作为参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值