Здравствуйте Jack, Вы писали:
J>Как подключиться к событиям СOM-объекта на С++ без ATL??
J>Как это сделать используя только compiler support? (т.е. #import, _com_ptr_t)
J>Делаю импоирт, получяю ДВА класса: _DObj и _DObjEvents.
J>С первым все ясно.
J>Как использовать второй? (Только C++, без ATL или MFC).
IConnectionPointContainer* pCPC = NULL;
IConnectionPoint* pCP = NULL;
IUnknown* pUnk = NULL;
_DObjEvents* ev = NULL;
DWORD dwCook = 0;
//запрашиваем IConnectionPointContainer
hr = m_DObj->QueryInterface(__uuidof(IConnectionPointContainer),(void**)&pCPC);
if (FAILED(hr)){...};
//находим точку соединения
hr = pCPC->FindConnectionPoint(__uuidof(__uuidof(_DObjEvents)), &pCP);
//освобождаем IConnectionPointContainer
pCPC->Release();
if (FAILED(hr)){...};
//Создаем объект
ev = new _DObjEvents;
//запрашиваем его IUnknown
hr = ev->QueryInterface(__uuidof(IUnknown), (void**) &pUnk);
if (FAILED(hr)){...};
//сообщаем серваку что мы готовы
hr = pCP->Advise(pUnk,&dwCook);
//освобождаем точку соединения
pCP->Release();
Здравствуйте Алекс, спасибо за ответ.
Вы писали:
...
А>//Создаем объект
А>ev = new _DObjEvents;
...
Ну так в этом и проблема: '_DObjEvents' это только интерфейс, т.е. класс с чисто виртуальными функциями. Так как он унаследован от IDispatch то для его использования нужно реализовать методы IDispatch, по крайней мере 'Invoke'

.
В конце концов был использован класс ATL 'IDispEventSimpleImpl' так как он не зависит от _Module ( хотя глобальная переменая _Module все равно должна быть объявлена, иначе будут ошибки компиляции).
Jack.