请问下com的动态转换
刚开始学习com,不明白。请高手讲解下。
有段代码,网上比较流行的。
显示2个类继承IUnknown
interface ISimpleMath : public IUnknown
{
public:
virtual int Add(int nOp1, int nOp2) = 0;
virtual int Subtract(int nOp1, int nOp2) = 0;
virtual int Multiply(int nOp1, int nOp2) = 0;
virtual int Divide(int nOp1, int nOp2) = 0;
};
interface IAdvancedMath : public IUnknown
{
public:
virtual int Factorial(int nOp1) = 0;
virtual int Fabonacci(int nOp1) = 0;
};
class CMath : public ISimpleMath, public IAdvancedMath
STDMETHODIMP CMath::QueryInterface(REFIID riid, void **ppv)
{// 这里这是实现dynamic_cast的功能,但由于dynamic_cast与编译器相关。
if(riid == IID_ISimpleMath)
*ppv = static_cast(this);
else if(riid == IID_IAdvancedMath)
*ppv = static_cast(this);
else if(riid == IID_IUnknown)
*ppv = static_cast(this);
else {
*ppv = 0;
return E_NOINTERFACE;
}
reinterpret_cast(*ppv)->AddRef(); //这里要这样是因为引用计数是针对组件的
return S_OK;
}
#include "interface.h"
#include "math.h"
STDMETHODIMP CMath::QueryInterface(REFIID riid, void **ppv)
{// 这里这是实现dynamic_cast的功能,但由于dynamic_cast与编译器相关。
if(riid == IID_ISimpleMath)
*ppv = static_cast<ISimpleMath*>(this);
else if(riid == IID_IAdvancedMath)
*ppv = static_cast<IAdvancedMath*>(this);
else if(riid == IID_IUnknown)
*ppv = static_cast<IUnknown*>(this); //错误
else {
*ppv = 0;
return E_NOINTERFACE;
}
reinterpret_cast<void*>(*ppv)->AddRef(); //这里要这样是因为引用计数是针对组件的
return S_OK;
}