请问下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;
};
Cmath的声明是
class CMath : public ISimpleMath, public IAdvancedMath
他修改了QueryInterface函数
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;
}
但是之前编译无法进行,不知道他到底表达的是什么意思啊。类型转换没有尖嘴好,我改了一下还是不知道怎么修改了,SimpleMath和AdvancedMath都是继承IUnknown但是Cmath不行。
#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;
}
[解决办法]
其实发文章的人代码里面是有 <> 号的.
只是 <> 被浏览器解释为 HTML 的标签了, 而那个网站没有做特别的处理, 就把 <> 这部分内容吃掉了.
你在看到代码的那个网页上点右键, 查看源代码, 应该可以找到代码里面 <> 的内容.