高分求助,里的例子,运行就是和预期不一致

captain_x 2005-06-21 10:27:05
#include <iostream.h>
#include <objbase.h>

void trace(const char *pMsg)
{
cout<<pMsg<<endl;
}

interface IX : IUnknown
{
virtual void _stdcall fx()=0;
};

interface IY : IUnknown
{
virtual void _stdcall fy()=0;
};

interface IZ : IUnknown
{
virtual void _stdcall fz()=0;
};

extern const IID IID_IX;
extern const IID IID_IY;
extern const IID IID_IZ;

class CA : public IX, public IY
{
public:
//IUnknown implementation
virtual HRESULT _stdcall QueryInterface(const IID& iid,void** ppv);
virtual ULONG _stdcall AddRef(){return 0;}
virtual ULONG _stdcall Release(){return 0;}

virtual void _stdcall fx() {cout<<"CA::fx"<<endl;}

virtual void _stdcall fy() {cout<<"CA::fy"<<endl;}
};

HRESULT _stdcall CA::QueryInterface (const IID &iid,void** ppv)
{
if(iid == IID_IUnknown)
{
trace("QueryInterface:Return pointer to IUnknown.");
*ppv = static_cast<IX*>(this);
}
else if(iid==IID_IX)
{
trace("QueryInterface:Return pointer to IX.");
*ppv = static_cast<IY*>(this);
}
else if(iid == IID_IY)
{
trace("QueryInterface:Return pointer to IY.");
*ppv = static_cast<IY*>(this);
}
else
{
trace("QueryInterface:Interface not supported.");
*ppv = NULL;
return E_NOINTERFACE;
}
reinterpret_cast<IUnknown*>(*ppv)->AddRef ();
return S_OK;
}

IUnknown * CreateInstance()
{
IUnknown *pI = static_cast<IX*>(new CA);
pI->AddRef ();
return pI;
}

static const IID IID_IX =
{0x32bb8320,0xb41b,0x11cf,
{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}};

static const IID IID_IY =
{0x32bb8321,0xb41b,0x11cf,
{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}};

static const IID IID_IZ =
{0x32bb8322,0xb41b,0x11cf,
{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}};


int main()
{
HRESULT hr;

trace("Client:Get an IUnknown pointer.");
IUnknown *pIUnknown = CreateInstance();

trace("Client:Get interface IX.");

IX *pIX = NULL;
hr = pIUnknown->QueryInterface (IID_IX,(void**)&pIX);
if(SUCCEEDED(hr))
{
trace("Client:Succeeded getting IX.");
//为什么这里最终调用的是fy(),正确的应该是fx(),不知道哪里错了
pIX->fx ();
}

trace("Client:Get interface IY.");

IY * pIY = NULL;
hr = pIUnknown->QueryInterface (IID_IY,(void**)&pIY);
if(SUCCEEDED(hr))
{
trace("Client:Succeeded getting IY.");
pIY->fy ();
}

trace("Client:Ask for an unsupported interface.");

IZ *pIZ = NULL;
hr = pIUnknown->QueryInterface (IID_IZ,(void**)&pIZ);
if(SUCCEEDED(hr))
{
trace("Client:Succeeded getting IZ.");
pIZ->fz ();
}
else
{
trace("Client:Could not get interface Iz.");
}

trace("Client:Get interface IY from interface IX.");
IY *pIYfromIX = NULL;
hr = pIX->QueryInterface (IID_IY,(void**)&pIYfromIX);
if(SUCCEEDED(hr))
{
trace("Client:Succeeded getting IY.");
pIYfromIX->fy ();
}

trace("Client:Get interface IUnknown from IY.");

IUnknown *pIUnknownFromIY = NULL;
hr = pIY->QueryInterface (IID_IUnknown,(void**)&pIUnknownFromIY);
if(SUCCEEDED(hr))
{
cout<<"Are the IUnknown pointers equal?";
if(pIUnknownFromIY == pIUnknown)
{
cout<<"Yes,pIUnknownFromIY == pIUnknown."<<endl;
}
else
{
cout<<"No,pIUnknownFromIY != pIUnknown."<<endl;
}
}

delete pIUnknown;

return 0;
}

这是全部的代码,在对IX->fx()调用的时候发现每次都是调用的IY->fy(),
实在是搞不明白了,高手们指点一下阿
先谢谢了
...全文
64 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
captain_x 2005-06-21
  • 打赏
  • 举报
回复
太感谢了
狂晕阿,这里居然写错了?
唉~~~~~~~~~~~~~~~~~~~~`
yongdu 2005-06-21
  • 打赏
  • 举报
回复
仔细看了半天,才发现你这儿错了。
HRESULT _stdcall CA::QueryInterface (const IID &iid,void** ppv)
{
............
else if(iid==IID_IX)
{
trace("QueryInterface:Return pointer to IX.");
*ppv = static_cast<IY*>(this); //这儿类型转成IY了,你取的是IX的指针,所以应该为*ppv = static_cast<IX*>(this);
}
xkit 2005-06-21
  • 打赏
  • 举报
回复
HRESULT _stdcall CA::QueryInterface (const IID &iid,void** ppv)
{
...
else if(iid==IID_IX)
{
trace("QueryInterface:Return pointer to IX.");
*ppv = static_cast<IY*>(this);
}
...
}
hr = pIUnknown->QueryInterface (IID_IX,(void**)&pIX)

你这里pIX得到的是IY的接口, pIX->fx()实际上是访问的是IY的fy

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧