Я подключился к интерфесу DWebBrowserEvents2 с помощью IConnectionPointContainer. После этого получаю уведомения о событиях(DISPID_QUIT,DISPID_WINDOWMOVE,DISPID_NEWWINDOW2 и т.д.). Это моя процедура IDispatch->Invoke_ Invoke_MC proc this_:dword, dispIdMember:dword, \ riid:dword, lcid:dword, wFlags:dword, \ pDispParams:dword, pVarResult:dword, \ pExcepInfo:dword, puArgErr:dword mov eax,dispIdMember .if eax==DISPID_NEWWINDOW2 ........... .elseif eax==DISPID_WINDOWMOVE ........... .endif mov eax,S_OK ret Invoke_MC endp Вопрос: Приходит мне уведомление DISPID_NEWWINDOW2. Как мне узнать lpDispatch нового IWebBrowser2? В MSDN написано void NewWindow2( IDispatch **&ppDisp, VARIANT_BOOL *&Cancel ); ppDisp - это то что мне надо, но как его получить? Я так подозреваю, что pDispParams - указатель на эти переменные, если да, то как их получить? Буду рад любым ответам.
Android А зачем через Invoke? Раз уж используешь ConnectionPoints, так реализуй Sink для интерфейса DWebBrowserEvents2 и ppDisp будет передаваться в твой обработчик. Дешёво и сердито. А если через pDispParams хочешь добираться, что ж, удачи. Вдумчиво читай описание структуры DISPPARAMS. Но камней наберёшь полные закрома.
Sink - это подписчик на события сом-объекта. Загляни на рсдн, почитай те статьи о Connection Points. Есть ещё в примерах SDK atlevent(в аттаче), там показано как разными способами реализовать Sink. Где-то я видел статью о ConnectionPoints, в которой показана низкоуровневая работа их (CP), оттуда на асм проще всего перевести, но я не помню, где она. Покопайся в atlevent, посмотри код макросов из ATL, которые там используются. Удачи. _1477514404__atlevent.zip
А какая идея? Я реализую свой интерфейс, с методами которые соответствуют событиям, и потом вызываются соответствующие методы моего интерфейса?
Именно. Ты реализуешь интерфейс полностью либо частично (наверняка не уверен), чтобы сом-объект мог вызывать твои обработчики. А потом подписываешь свой интерфейс с помощью ConnectionPoints. Только вот не помню, подписываешь то ли весь интерфейс, то ли отдельно методы — те макросы скрывают всю черновую работу. Скорее всего второе.
Это интерфейс DWebBrowserEvents: BeforeNavigate CommandStateChange DownloadBegin DownloadComplete NavigateComplete NewWindow OnQuit ProgressChange PropertyChange StatusTextChange TitleChange Fires WindowActivate WindowMove WindowResize он наследуется от IDispatch(MSDN). Т.е. если я хочу сделать обработчик на него я должен реализовать стандартный интерфес с IDispatch? Что-то вроде этого: QueryInterface AddRef Release GetTypeInfoCount GetTypeInfo GetIDsOfNames Invoke ; а здесь какая последовательность?????????? BeforeNavigate CommandStateChange DownloadBegin DownloadComplete NavigateComplete NewWindow OnQuit ProgressChange PropertyChange StatusTextChange TitleChange Fires WindowActivate WindowMove WindowResize Если я прав, то где можно узнать в какой последовательности идут методы в этом интерфейсе(в мсдн все расположенно в алфавитном порядке!!! блин!!!).
IceStudent Именно. Ты реализуешь интерфейс полностью либо частично (наверняка не уверен), чтобы сом-объект мог вызывать твои обработчики. Ты этим занималься? Если есть исходники кинь, пожалуйста.
Android Ага, интерфейс, включающий методы IDispatch и плюс DWebBrowserEvents2. приведи решение. если кодом, то в аттаче.