在类厂创建了一个实例对象后,当然也就有一个指针指向了该对象,接下来我不调用QueryInterface(),然后我就用这个指针来调用接口中的函数,这样行吗?
我一直在QueryInterface()这里弄不明白:感觉类厂创建了一个对象,那么对象的指针就可以直接调用接口中的函数,干吗还有调用QueryInterface()来实现接口,有点迷糊?请大家给予解释,谢谢!
我一直在QueryInterface()这里弄不明白:感觉类厂创建了一个对象,那么对象的指针就可以直接调用接口中的函数,干吗还有调用QueryInterface()来实现接口,有点迷糊?请大家给予解释,谢谢!
这是一个大工程,需要精通com
{
HRESULT hr;
register IExample *thisobj;
*objHandle = 0;
if (punkOuter)
hr = CLASS_E_NOAGGREGATION;
else
{
if (!(thisobj = (IExample *)GlobalAlloc(GMEM_FIXED, sizeof(MyRealIExample))))
hr = E_OUTOFMEMORY;
else
{
thisobj->lpVtbl = (IExampleVtbl *)&IExample_Vtbl;
((MyRealIExample *)thisobj)->count = 1;
((MyRealIExample *)thisobj)->buffer[0] = 0;
hr = IExample_Vtbl.QueryInterface(thisobj, vTableGuid, objHandle);
IExample_Vtbl.Release(thisobj);
if (!hr) InterlockedIncrement(&OutstandingObjects);
}
}
return(hr);
}
static HRESULT STDMETHODCALLTYPE QueryInterface(IExample *this, REFIID vTableGuid, void **ppv)
{
if (!IsEqualIID(vTableGuid, &IID_IUnknown) && !IsEqualIID(vTableGuid, &IID_IExample))
{
*ppv = 0;
return(E_NOINTERFACE);
}
*ppv = this;
this->lpVtbl->AddRef(this);
return(NOERROR);
}
为了从一个接口找到其他的接口,就要QueryInterface。
static HRESULT STDMETHODCALLTYPE QueryInterface(IExample *this, REFIID vTableGuid, void **ppv)
{
if (!IsEqualIID(vTableGuid, &IID_IUnknown) && !IsEqualIID(vTableGuid, &IID_IExample))
{
//该对象只支持IUnknown和IExample接口,如果询问其他接口,就返回NULL表示不支持。
*ppv = 0;
return(E_NOINTERFACE);
}
*ppv = this;//这个this不是c++的this,这是C代码,this是传进来的参数。
this->lpVtbl->AddRef(this);//增加对象的引用计数
return(NOERROR);
}
创建函数这么写也是有道理的。比如对象增加接口了,那么"多此一举"后,就只需要修改QueryInterface就行了,而创建函数不用改,用户用新的REFIID就可以在创建时获得新的接口。
刚才测试:注释掉QueryInterface()方法的调用!
没有这一句,objHandle没有赋值。
hr = IExample_Vtbl.QueryInterface(thisobj, vTableGuid, objHandle);
添加:
*objHandle=thisobj;
还是不行
"0x00310032"指令引用的"0x00310032"内存,该内存不能为"written"
"0x00310032"指令引用的"0x00310032"内存,该内存不能为"written"
这样的话,还必须要调用QueryInterface()
IExample_Vtbl.Release(thisobj);
这一句之后,对象释放掉了。
...所有接口都是IUnknown,但IUnknown什么都不是(这也是这个名称的意义)。换句话说,任何接口都可以直接转换成IUnknown并调用IUnknown的方法,但给你一个IUnknown接口,你说它是IA还是IB?QueryInterface的意义就来了,它不关心实现这个接口的组件是如何实现的,也不关心组件实现了几个接口,更不关心接口是被组件直接继承的还是包容的还是聚合的,所有这些细节都是组件的内政,不容外部干涉。楼主的假设并非不对,但只是一种组件具体实现方式而已,即无通用性也没代表性。...接口是语言无关的,你怎么能把一个接口强制转换成一个C++指针呢,其它语言创建的接口怎么转换?...在多线程或多进程环境下,组件接口都是要列集散列的,即使某个接口满足楼主假设的所有条件(C++类实现的单接口),你也不能把接口指针强制转换成C++指针,因为代理指针只代理接口,不代理组件,强制转换的后果是不可预料的。QI的作用还有很多,这几条理由够不够用?