множественное наследование,ATL,COM
От: eProgD  
Дата: 29.10.08 13:14
Оценка:
Погомите разобраться
есть простейшая иерархия интерфейсов
IUnknown IUnknown
| |
I1 I2
\ /
\ /
II
|
CII(реализация)

И код ее реализующий:

    struct __declspec(uuid("A7F6D957-1A1E-45fc-B710-8A841990C4A6")) I1;
    struct I1: public IUnknown
    {
        STDMETHOD(Foo1()) = 0;
    };
    struct __declspec(uuid("A7F6D957-1A1E-45fc-B710-8A841990C4A1")) I2;
    struct I2: public IUnknown
    {
        STDMETHOD(Foo2()) = 0;
    };


    struct __declspec(uuid("A7F6D957-1A1E-45fc-B710-8A841990C4A2")) II;
    struct II: public I1, public I2
    {
        STDMETHOD(Foo()) = 0;
    };
    class CII : public CComObjectRootEx<CComSingleThreadModel>, public II
    {
    public:
        BEGIN_COM_MAP(CII)
            COM_INTERFACE_ENTRY(IUnknown)
            COM_INTERFACE_ENTRY(I1)
            COM_INTERFACE_ENTRY(I2)
            COM_INTERFACE_ENTRY(II)
        END_COM_MAP()
        STDMETHODIMP Foo1()
        {
            return S_OK;
        }

        STDMETHODIMP Foo2()
        {
            return S_OK;
        }

        STDMETHODIMP Foo()
        {
                        return S_OK;
        }
    };


Проблема в том, что компилятор ругается при попытке закастить CII* к IUnknown*
Что я делаю не так?
Re: множественное наследование,ATL,COM
От: Rocky  
Дата: 29.10.08 14:13
Оценка:
Здравствуйте, eProgD, Вы писали:

PD>Проблема в том, что компилятор ругается при попытке закастить CII* к IUnknown*

PD>Что я делаю не так?

Надо воспользоваться QueryInterface.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: множественное наследование,ATL,COM
От: rus blood Россия  
Дата: 30.10.08 07:55
Оценка:
Здравствуйте, eProgD, Вы писали:

PD>
PD>    class CII : public CComObjectRootEx<CComSingleThreadModel>, public II
PD>    {
PD>    public:
PD>        BEGIN_COM_MAP(CII)
PD>            // COM_INTERFACE_ENTRY(IUnknown)
PD>            COM_INTERFACE_ENTRY(I1)
PD>            COM_INTERFACE_ENTRY(I2)
PD>            COM_INTERFACE_ENTRY(II)
PD>        END_COM_MAP()
PD>    };
PD>


PD>Что я делаю не так?


Вот это убери...
Реализация IUnknown объявлена в BEGIN_COM_MAP.
Имею скафандр — готов путешествовать!
Re[2]: множественное наследование,ATL,COM
От: Аноним  
Дата: 30.10.08 09:05
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Здравствуйте, eProgD, Вы писали:


PD>>
PD>>    class CII : public CComObjectRootEx<CComSingleThreadModel>, public II
PD>>    {
PD>>    public:
PD>>        BEGIN_COM_MAP(CII)
PD>>            // COM_INTERFACE_ENTRY(IUnknown)
PD>>            COM_INTERFACE_ENTRY(I1)
PD>>            COM_INTERFACE_ENTRY(I2)
PD>>            COM_INTERFACE_ENTRY(II)
PD>>        END_COM_MAP()
PD>>    };
PD>>


PD>>Что я делаю не так?


RB>Вот это убери...

RB>Реализация IUnknown объявлена в BEGIN_COM_MAP.

Дело не только в IUnknown. Если I1 и I2 наследуются от одного интерфейса(к примеру IBase)
то при попытки COM_INTERFACE_ENTRY(IBase), компилятор все равно выдаст ошибку.
Re[3]: множественное наследование,ATL,COM
От: rus blood Россия  
Дата: 30.10.08 11:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Дело не только в IUnknown. Если I1 и I2 наследуются от одного интерфейса(к примеру IBase)

А>то при попытки COM_INTERFACE_ENTRY(IBase), компилятор все равно выдаст ошибку.

COM_INTERFACE_ENTRY2(IBase, I1) — указание получить IBase через I1.
Имею скафандр — готов путешествовать!
Re: множественное наследование,ATL,COM
От: Vi2 Удмуртия http://www.adem.ru
Дата: 31.10.08 06:54
Оценка:
Здравствуйте, eProgD, Вы писали:

PD>Погомите разобраться

PD>есть простейшая иерархия интерфейсов
PD> I1 I2
PD> \ /
PD> \ /
PD> II
PD>    struct __declspec(uuid("A7F6D957-1A1E-45fc-B710-8A841990C4A2")) II;
PD>    struct II: public I1, public I2
PD>    {
PD>        STDMETHOD(Foo()) = 0;
PD>    };
PD>    class CII : public CComObjectRootEx<CComSingleThreadModel>, public II
PD>    {
PD>    public:
PD>        BEGIN_COM_MAP(CII)
PD>...
PD>            COM_INTERFACE_ENTRY(II)
PD>        END_COM_MAP()

PD>Что я делаю не так?

Интересно, и каков же состав "интерфейса" II в твоем понимании?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.