C++ COM编程之QueryInterface函数(一)(2)
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
{
*ppv = NULL;
return E_NOINTERFACE;
}
static_cast<IUnknown *>(*ppv)->AddRef();
return S_OK;
}
QueryInterface的简单使用
当我获得了一个IUnknown指针以后,就可以调用对应的QueryInterface进行查询了,如下:
void Fod(IUnknown *pI)
{
IX *pIX = NULL;
// Ask for interface IX
HRESULT hr = pI->QueryInterface(IID_IX, (void **)&pIX);
// Check the return value
if (SUCCEEDED(hr))
{
// Use the interface
pIX->Fx();
}
}
完整的例子
上面说了那么多了,现在提供一个完整的例子,将上面的各种理论知识都在实际代码中进行了实践,让各位能更好的理解QueryInterface。(下载)。
总结
QueryInterface理解起来比较简单,但是,它的理论知识还是必须要去掌握的,理论是一切的基础,没有理论作为支撑,任何实际的操作都不会那么可靠和可信,所以,这篇文章总结的偏于理论多一些。由于QueryInterface部分的内容比较多,使用一篇文章无法总结的齐全,所以,之后我还会继续总结关于QueryInterface的第二部分。