Re: Приведение пойнтера на интерфейс к пойнтеру на объект кл
От: migel  
Дата: 12.11.04 21:16
Оценка:
Здравствуйте, -=chp=-, Вы писали:


C>Заодно можно ли сделать идеологически правильной мою схему с приведениями типов или в морг?

Дык заведи просто внутренний интерфейс и назначь ему приватный — гуид
Что-то типа такого

extern const IID IID_IInternalPageSafe;
MIDL_INTERFACE("0A9CEC92-62B1-47dc-B5A3-E3F0E76E5BD2")
IInternalPageSafe : public IUnknown
{
    virtual CXFormObject* GetUnderlayingForm() = 0;
};

// CPage

class ATL_NO_VTABLE CPage : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CPage, &CLSID_Page>,
    public IPersistStorageImpl<CPage>,
    public IPersistStreamInitImpl<CPage>,
    public IPersistPropertyBagImpl<CPage>,
    public IDispatchImpl<IPage, &IID_IPage, &LIBID_XFormLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
    public IInternalPageSafe,
    public IPropertyNotifySink
{
BEGIN_COM_MAP(CPage)
    COM_INTERFACE_ENTRY(IPage)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IInternalPageSafe)
}


// {0A9CEC92-62B1-47dc-B5A3-E3F0E76E5BD2}
static const GUID IID_IInternalPageSafe =
{ 0xa9cec92, 0x62b1, 0x47dc, { 0xb5, 0xa3, 0xe3, 0xf0, 0xe7, 0x6e, 0x5b, 0xd2 } };

Дальше используй обычно через QueryInterface()

        CComPtr<IInternalPageSafe> spSafe;
        // pPage - объект который реализует скрытый интерфейс
        if (FAILED(pPage->QueryInterface(IID_IInternalPageSafe, (void**)&spSafe)))
            return E_NOINTERFACE;
... << RSDN@Home 1.1.4 beta 3 rev. 190>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.