Здравствуйте, 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();