Как подключиться к событиям на С++ без АТL / MFC
От: Jack  
Дата: 27.08.02 17:20
Оценка:
Как подключиться к событиям СOM-объекта на С++ без ATL??
Как это сделать используя только compiler support? (т.е. #import, _com_ptr_t)
Делаю импоирт, получяю ДВА класса: _DObj и _DObjEvents.
С первым все ясно.
Как использовать второй? (Только C++, без ATL или MFC).
Люблю OSCилировать
Re: Как подключиться к событиям на С++ без АТL / MFC
От: Алекс Россия http://wise-orm.com
Дата: 28.08.02 06:09
Оценка: 2 (1)
Здравствуйте 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();
Re[2]: Как подключиться к событиям на С++ без АТL / MFC
От: Jack  
Дата: 29.08.02 07:30
Оценка:
Здравствуйте Алекс, спасибо за ответ.
Вы писали:

...
А>//Создаем объект
А>ev = new _DObjEvents;
...


Ну так в этом и проблема: '_DObjEvents' это только интерфейс, т.е. класс с чисто виртуальными функциями. Так как он унаследован от IDispatch то для его использования нужно реализовать методы IDispatch, по крайней мере 'Invoke'.
В конце концов был использован класс ATL 'IDispEventSimpleImpl' так как он не зависит от _Module ( хотя глобальная переменая _Module все равно должна быть объявлена, иначе будут ошибки компиляции).

Jack.
Люблю OSCилировать
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.