描述:
在COM 技术内幕里有这样一段代码,如下:
#include <iostream.h>
#include <objbase.h>
void trace(const char* msg) {cout<<msg<<endl;}
interface IX : public IUnknown
{
virtual void __stdcall FX() = 0;
};
interface IY : public IUnknown
{
virtual void __stdcall FY() = 0;
};
interface IZ : public 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 QureyInterface(const IID& idd, void** ppv);
virtual ULONG __stdcall AddRef() { return 0;}
virtual ULONG __stdcall Release() { return 0;}
virtual void __stdcall FX() { trace("FX"); }
virtual void __stdcall FY() { trace("FY"); }
};
HRESULT __stdcall CA::QureyInterface(const IID& idd, void** ppv)
{
if( idd == IID_IUnknown )
{
trace("QureyInterface: Return a pointer to IUnknown");
*ppv = static_cast<IX*> (this);
}
else if( idd == IID_IX )
{
trace("QureyInterface: Return a pointer to IX");
*ppv = static_cast<IX*> (this);
}
else if( idd == IID_IY )
{
trace("QureyInterface: Return a pointer to IY");
*ppv = static_cast<IY*> (this);
}
else
{
trace("QureyInterface: Interface not support");
*ppv = NULL;
return E_NOINTERFACE;
}
reinterpret_cast<IUnknown*> (*ppv)->AddRef();
return S_OK;
}
IUnknown* CreateInstance()
{
IUnknown* pI = static_cast<IX*>( CA() );
pI->AddRef();
return pI;
}
// {A97B3092-70C2-4909-B3AD-E21E85BD3632}
static const IID IID_IX =
{ 0xa97b3092, 0x70c2, 0x4909, { 0xb3, 0xad, 0xe2, 0x1e, 0x85, 0xbd, 0x36, 0x32 } };
// {4212198C-2D98-4e05-8557-FB082A8541F4}
static const IID IID_IY =
{ 0x4212198c, 0x2d98, 0x4e05, { 0x85, 0x57, 0xfb, 0x8, 0x2a, 0x85, 0x41, 0xf4 } };
// {776683C7-AF1C-4b93-8DCF-8B29B2521E75}
static const IID IID_IZ =
{ 0x776683c7, 0xaf1c, 0x4b93, { 0x8d, 0xcf, 0x8b, 0x29, 0xb2, 0x52, 0x1e, 0x75 } };
void 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 Succeed in getting IX");
pIX->FX();
}
trace("Client Get interface IY.");
IY* pIY = NULL;
hr = pIUnknown->QueryInterface(IID_IY, (void**)&pIY);
if( SUCCEEDED(hr) )
{
trace("Client SUCCEEDED in getting IY");
pIY->FY();
}
trace("Client Get interface IZ.");
IZ* pIZ = NULL;
hr = pIUnknown->QueryInterface(IID_IZ, (void**)&pIZ);
if( SUCCEEDED(hr) )
{
trace("Client SUCCEEDED in getting IZ");
pIZ->FZ();
}
else
{
trace("Can not get interface IZ");
}
}
可是我这样运行后却提示 CA无法实例化抽象类,这是为什么啊。CA里所有的虚函数都已经定义了啊。
解决方案1:
估计是你打错了,代码本身没什么问题。
解决方案2: 你的程序就这一个错误吗?我刚才按照自己的理解编了一下,没有错啊,运行结果对。书上有extern const IID IID_IX;extern const IID IID_IY;extern const IID IID_IZ;这三行,我认为extern用的不对,我没有用这三行,直接写了// {A97B3092-70C2-4909-B3AD-E21E85BD3632}
static const IID IID_IX =
{ 0xa97b3092, 0x70c2, 0x4909, { 0xb3, 0xad, 0xe2, 0x1e, 0x85, 0xbd, 0x36, 0x32 } };
// {4212198C-2D98-4e05-8557-FB082A8541F4}
static const IID IID_IY =
{ 0x4212198c, 0x2d98, 0x4e05, { 0x85, 0x57, 0xfb, 0x8, 0x2a, 0x85, 0x41, 0xf4 } };
// {776683C7-AF1C-4b93-8DCF-8B29B2521E75}
static const IID IID_IZ =
{ 0x776683c7, 0xaf1c, 0x4b93, { 0x8d, 0xcf, 0x8b, 0x29, 0xb2, 0x52, 0x1e, 0x75 } };
extern const的用法是多文件时,在一个文件里定义了常量,在别的文件里引用。自己再重新作一下了,祝你好运。
Vc不支持这样的,一个CA接口继承了两个IUnknow