Re[3]: Как в ATL клиенте подписываться на события
От: Axil Германия  
Дата: 01.03.06 14:41
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

A>>Кажется (не уверен что прав) тут есть одна ошибка, класс CMainDlg не наследник IDispatch.


OE>и?


A>>И вызов Invoke

A>> IDispatch* pConnection = static_cast<IDispatch *>(punkConnection.p);
A>> pConnection->Invoke(...);
A>>Не совсем правильный...

OE>а это где такой? я такого не писал


А его никто не писал, его визард сам напишет
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_atl_Adding_Connection_Points_to_an_Object.asp

И класс который он сгенерирует будет выглядеть примерно так —

template<class T>
class CProxy_ISomeEvents : public IConnectionPointImpl<T, &__uuidof(_ISomeEvents)>
{
public:
    HRESULT Fire_OnAction(void) {
        HRESULT hr = S_OK;
        T* pThis = static_cast<T*>(this);
        int cConnections = m_vec.GetSize();

        for (int iConnection = 0; iConnection < cConnections; iConnection++) {
            pThis->Lock();
            CComPtr<IUnknown> punkConnection = m_vec.GetAt(iConnection);
            pThis->Unlock();

            IDispatch* pConnection = static_cast<IDispatch*>(punkConnection.p);

            if (pConnection) {
                hr = pConnection->Invoke(...);
            }
        }
        return hr;
    }
};


Вот тут и есть тот самый каст к IDispatch.
IDispatch* pConnection = static_cast<IDispatch*>(punkConnection.p); // punkConnection.p содержит IUnknown от объекта класса CMainDlg

Имхо имеет смысл добавить к классу CMainDlg в базы такую туповатую строчку —
, public IDispatchImpl<IDispatch, &__uuidof(IDispatch), &LIBID_....>
Тогда этот каст будет логически обоснован, хоть както .

Но может я и ошибаюсь и гдето чего то просмотрел...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.