描述:
#include <iostream.h>
#include <objbase.h>
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
{
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<<"Fx"<<endl;}
virtual void __stdcall Fy() {cout<<"Fy"<<endl;}
};
HRESULT CA::QueryInterface(const IID & iid,void ** ppv)
{
/*
if(iid == IID_IUnknow)
{
cout<<"this is IID_IUnknown!"<<endl;
*ppv = static_cast<IX*>(this)
}
*/
if(iid == IID_IX)
{
cout<<"this is IID_IX";
IX *ppv = static_cast<IX*>(this);
//*ppv = <>
}
else if(iid == IID_IY)
{
cout<<"this is IID_IY";
IY *ppv = static_cast<IY*>(this);
}
/*
else if(iid == IID_IZ)
{
cout<<"this is IID_IZ";
*ppv = static_cast<IZ*> (this)
}
*/
else
{
cout<<"no interface";
return E_NOINTERFACE;
}
// reinterpret_cast<IUnknown*>(*ppv)->AddRef();
// IUnknown * ppv = reinterpret_cast<IUnknown*>(*ppv);
//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 = {0x32bb8321,0xb41b,0x11cf,{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x86}};
static const IID IID_IY = {0x32bb8321,0xb41b,0x11cf,{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x87}};
static const IID IID_IZ = {0x32bb8321,0xb41b,0x11cf,{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x88}};
int main()
{
HRESULT hr;
IUnknown * pIUnknown = CreateInstance();
IX * pIX = NULL;
hr = pIUnknown->QueryInterface(IID_IX,(void**)&pIX);
if(SUCCEEDED(hr))
{
cout<<"it is succeeded"<<endl;
pIX->Fx();
}
IY * pIY = NULL;
hr = pIUnknown->QueryInterface(IID_IY,(void**)pIY);
if(SUCCEEDED(hr))
{
cout<<"it is succedede"<<endl;
pIY->Fy();
}
IZ * pIZ = NULL;
hr = pIUnknown->QueryInterface(IID_IZ,(void**)pIZ);
if(SUCCEEDED(hr))
{
cout<<"it is succedede"<<endl;
pIZ->Fz();
}
else
{
cout<<"can not bad!"<<endl;
}
IUnknown * pIUnknownFromIY = NULL;
hr = pIUnknown->QueryInterface(IID_IUnknown,(void**)pIUnknownFromIY);
if(hr)
{
cout<<"sucess"<<endl;
if(pIUnknownFromIY == pIUnknown)
{
cout<<"pIUnknownFromIY == pIUnknown"<<endl;
}
else
{
cout<<"pIUnknownFromIY != pIUnknown"<<endl;
}
}
delete pIUnknown;
return 0;
}
请高手指点,小弟先谢!
解决方案1:
如下:我只改了我说的部分
#include <iostream.h>
#include <objbase.h>
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
{
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<<"Fx"<<endl;}
virtual void __stdcall Fy() {cout<<"Fy"<<endl;}
};
HRESULT CA::QueryInterface(const IID & iid,void ** ppv)
{
/*
if(iid == IID_IUnknow)
{
cout<<"this is IID_IUnknown!"<<endl;
*ppv = static_cast<IX*>(this)
}
*/
if(iid == IID_IX)
{
cout<<"this is IID_IX\n";
*ppv = static_cast<IX*>(this);
//*ppv = <>
}
else if(iid == IID_IY)
{
cout<<"this is IID_IY";
*ppv = static_cast<IY*>(this);
}
/*
else if(iid == IID_IZ)
{
cout<<"this is IID_IZ";
*ppv = static_cast<IZ*> (this)
}
*/
else
{
cout<<"no interface";
return E_NOINTERFACE;
}
// reinterpret_cast<IUnknown*>(*ppv)->AddRef();
// IUnknown * ppv = reinterpret_cast<IUnknown*>(*ppv);
//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 = {0x32bb8321,0xb41b,0x11cf,{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x86}};
static const IID IID_IY = {0x32bb8321,0xb41b,0x11cf,{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x87}};
static const IID IID_IZ = {0x32bb8321,0xb41b,0x11cf,{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x88}};
int main()
{
HRESULT hr;
IUnknown * pIUnknown = CreateInstance();
IX * pIX = NULL;
hr = pIUnknown->QueryInterface(IID_IX,(void**)&pIX);
if(SUCCEEDED(hr))
{
cout<<"it is succeeded"<<endl;
pIX->Fx();
}
IY * pIY = NULL;
hr =&