COM编程入门,十分浅显易懂
会按顺序进行服务器的方法调用。 也就是说,一旦一个方法调用开始,所有其它试图调用方法的线程都将阻塞,直到第一个方法返回。COM库本身确保服务器一次不会被一个以上的线程闯入。
QueryInterface()
QueryInterface()简称QI(),由客户端程序调用这个函数从COM对象请求不同的接口。我们在例子代码中因为只实现一个接 口,QI()会很容易使用。QI()有两个参数:一个是所请求的接口IID,一个是指针的缓冲大小,如果查询成功,QI()将接口指针地址存储在这个缓冲 指针中。
HRESULT CUnknownImpl::QueryInterface ( REFIID riid, void** ppv ) {
HRESULT hrRet = S_OK;
// 标准QI()初始化 – 置 *ppv 为 NULL.
*ppv = NULL;
// 如果客户端请求提供的接口,给 *ppv.赋值
if ( IsEqualIID ( riid, IID_IUnknown ))
{
*ppv = (IUnknown*) this;
}
else
{
// 不提供客户端请求的接口
hrRet = E_NOINTERFACE;
}
// 如果返回一个接口指针。 调用AddRef()增加引用计数.
if ( S_OK == hrRet )
{
((IUnknown*) *ppv)->AddRef();
}
return hrRet;
}
在QI()中做了三件不同的事情:
1. 初始化传入的指针为NULL;
[*ppv = NULL;]
2. 检查riid,确定组件对象类(coclass)实现了客户端所请求接口;
3. [if ( IsEqualIID ( riid, IID_IUnknown ))];