Где-то когда-то встречался вопрос, как из указателя на интерфейс получить указатель на класс, которым этот указатель имплементирован. Сейчас не могу найти где это было, а материал попался интересный. Может кому-то в ряде случаев и будет полезным.

HOWTO: Get a C++ Class from an Interface Pointer in ATL
Q234785

Кратко оттуда:
...Один из самых легких и самых безопасных методов выполнить это "преобразование" — использование ATL COM карты и QueryInterface. Помещая указатель на C++ класс в COM карту и используя CLSID в качестве идентификации интерфейса, Вы можете благополучно получить указатель на объект, вызывая QueryInterface метод.
BEGIN_COM_MAP(CMyAtlObj)
   // ... other COM_INTERFACE_ENTRY macros
   COM_INTERFACE_ENTRY_IID(CLSID_MyAtlObj, CMyAtlObj)
END_COM_MAP()

И использование
    CMyAtlObj* pObj;
...
    if( SUCCEEDED(pUnk->QueryInterface(CLSID_MyAtlObj, (void **)&pObj)) )
    {
        hReturn = pObj->Method1(); //Method1 is a public member function of CMyAtlObj class.
        pObj->Release(); //Needed because we called QueryInterface.
    }
Автор: Vi2    Оценить