在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.   

    你的程序就这一个错误吗?我刚才按照自己的理解编了一下,没有错啊,运行结果对。书上有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的用法是多文件时,在一个文件里定义了常量,在别的文件里引用。自己再重新作一下了,祝你好运。
      

  2.   

    Vc不支持这样的,一个CA接口继承了两个IUnknow
      

  3.   

    TO bit1010(于剑泉): 麻烦你把你正确的代码贴上来看一下(PS 不好意思,回贴发成段消息了^-^TO DoubleJiang(Double):在COM组件里很多情况都是一个类继承两个IUnknow接口,所以估计VC应该支持。