Re[2]: Приведение пойнтера на интерфейс к пойнтеру на объект
От: Ivan Россия www.rsdn.ru
Дата: 16.11.04 11:44
Оценка:
Здравствуйте, migel, Вы писали:

> m_pSignal = (CSignal *)p;

это неправильно. если CSignal реализует несколько интерфейсов, то указатели на разные интерфейсы будут отличаться друг от друга и от адреса самого объекта.

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


гораздо проще:
BEGIN_COM_MAP(CSignal)
   COM_INTERFACE_ENTRY(ISignal)
   COM_INTERFACE_ENTRY_IID(CLSID_Signal, CSignal)
END_COM_MAP()


технология вполне нормальная, но есть пара особенностей:
— не работает если есть маршалинг
— при включенном ATL_DEBUG_INTERFACES QueryInterface будет возвращать указатель на QIThunk, его нужно убирать вручную, например, так:
ISignal* pItf = ...;
CSignal* pSignal = 0;

pItf->QueryInterface(CLSID_Signal, &pSignal);
#ifdef _ATL_DEBUG_INTERFACES
    _QIThunk* pThunk = reinterpret_cast<_QIThunk*>(pSignal);
    pSignal = reinterpret_cast<CSignal*>(pThunk->m_pUnk);
    _AtlDebugInterfacesModule.DeleteThunk(pThunk);
#endif

...
pSignal->Release();
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.