有关QueryInterface函数
2008-03-24 11:51
323 查看
一,QueryInterface函数
原型:
HRESULT __stdcall QueryInterface(const IID&iid,void **ppv);
iid:标志客户所需的接口。是”一个接口标志符“结构(IID)。
ppv:QueryInterface用来存放所请求接口的地址。
返回值:可以返回S_OK 或 E_NOINTERFACE应该用SUCEEDED或者FAILED宏验证是否成功。
使用方法:
假如知道一个指向IUnknown接口的指针pI,传给它一个接口标志符即可
例如:
void Foo(IUnknown * pI)
{
IX * pIX = NULL;
HRESULT hr = pI->QueryInterface(IID_IX,(void **)pIX);
if(SUCCEEDED(hr))
{
pIX->FX();
}
}
//QueryInterface的实现。
HRESULT _stdcall CA::QueryInterface(const IID&iid,void **ppv)
{
if(iid == IID_IUnknown)
{
*ppv = static_cast<IX *>(this);
}
else if(iid == IID_IX)
{
*ppv = static_cast<IX *>(this);
}
else if(iid == IID_IY)
{
*ppv = static_cast<IY *>(this);
}
else if(iid == IID_IUnknown)
{
*ppv = NULL;
return E_NOINTERFACE;
}
static_cast <IUnknown *> (* ppv)->AddRef();
retru S_OK;
}
多重继承及类型转换。
通常将一种类型的指针转换为另一种类型并不会改变它的值。为了支持多重继承,某些情况下,C++必须改变类指针的值。
假如一个类定义如下:
class CA: public IX,public IY{...};
由于CA同时继承了IX,IY因此可以使用IX或IY指针的地方均可以使用指向CA的指针。
void foo(IX* pIX);
void bar(IY* pIY);
int main()
{
CA* pA = new CA;
foo(pA);
bar(pA);
delete pA;
return 0;
}
foo需要一个指向合法的IX的虚拟函数表的指针;
bar需要一个指向合法的IY的虚拟函数表的指针;
当然IX和IY的虚拟函数表的内容是不一样的。因此将一个IX vtbl传给bar时,此函数是不能正常工作的。
因此编译器将同一指针传给foo和bar是不可能的,它必须对CA的指针进行修改以便他指向一个合适的vtbl指针。
下图显示了CA对象的内存结构。
原型:
HRESULT __stdcall QueryInterface(const IID&iid,void **ppv);
iid:标志客户所需的接口。是”一个接口标志符“结构(IID)。
ppv:QueryInterface用来存放所请求接口的地址。
返回值:可以返回S_OK 或 E_NOINTERFACE应该用SUCEEDED或者FAILED宏验证是否成功。
使用方法:
假如知道一个指向IUnknown接口的指针pI,传给它一个接口标志符即可
例如:
void Foo(IUnknown * pI)
{
IX * pIX = NULL;
HRESULT hr = pI->QueryInterface(IID_IX,(void **)pIX);
if(SUCCEEDED(hr))
{
pIX->FX();
}
}
//QueryInterface的实现。
HRESULT _stdcall CA::QueryInterface(const IID&iid,void **ppv)
{
if(iid == IID_IUnknown)
{
*ppv = static_cast<IX *>(this);
}
else if(iid == IID_IX)
{
*ppv = static_cast<IX *>(this);
}
else if(iid == IID_IY)
{
*ppv = static_cast<IY *>(this);
}
else if(iid == IID_IUnknown)
{
*ppv = NULL;
return E_NOINTERFACE;
}
static_cast <IUnknown *> (* ppv)->AddRef();
retru S_OK;
}
多重继承及类型转换。
通常将一种类型的指针转换为另一种类型并不会改变它的值。为了支持多重继承,某些情况下,C++必须改变类指针的值。
假如一个类定义如下:
class CA: public IX,public IY{...};
由于CA同时继承了IX,IY因此可以使用IX或IY指针的地方均可以使用指向CA的指针。
void foo(IX* pIX);
void bar(IY* pIY);
int main()
{
CA* pA = new CA;
foo(pA);
bar(pA);
delete pA;
return 0;
}
foo需要一个指向合法的IX的虚拟函数表的指针;
bar需要一个指向合法的IY的虚拟函数表的指针;
当然IX和IY的虚拟函数表的内容是不一样的。因此将一个IX vtbl传给bar时,此函数是不能正常工作的。
因此编译器将同一指针传给foo和bar是不可能的,它必须对CA的指针进行修改以便他指向一个合适的vtbl指针。
下图显示了CA对象的内存结构。
相关文章推荐
- 有关动态内存的几个函数
- DB2中有关日期和时间的函数,及应用
- tf.train.XXX与train有关的函数
- 有关VA_LIST的用法--变参函数的实现
- 有关函数模板和类模板的说法
- DB2中有关日期和时间的函数,及应用(转)
- Halcon学习之四:有关图像生成的函数
- DB2中有关日期和时间的函数,及应用
- PHP之有关类和对象的系统函数与运算符
- Creo二次开发--函数(14)--与颜色有关的函数
- 有关STL的二分查找函数的理解
- js 有关字符串的函数 以及一些和字符串有关的知识
- 有关类类型的函数
- 一连浪了好几天了,一直没好好的学习,希望在运动会结束后能够好好的认真学习,下面是关于栈的链表形式的有关函数的实现,与上一个实现形式有所差别
- 有关文件的操作 fopen/fwriite/fseek/ftell/fread/fclose等函数的使用方法
- C语言中有关外部函数调用的问题
- Openssl有关大数运算函数介绍
- 有关EXE加载和调用DLL函数的例子;用ATL函数修改注册表和内存存贮的一些认识(一)
- 与socket有关的一些函数介绍
- 【Linux】 CPU亲和性(affinity)及与亲和性有关的两个函数 sched_setaffinity()和 sched_getaffinity()