Здравствуйте, 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_....>
Тогда этот каст будет логически обоснован, хоть както

.
Но может я и ошибаюсь и гдето чего то просмотрел...