Как получать информацию о событиях? (COM)

Тема в разделе "WASM.WIN32", создана пользователем Android, 28 июл 2005.

  1. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Я подключился к интерфесу 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 - указатель на эти переменные, если да, то как их получить?



    Буду рад любым ответам.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Android

    А зачем через Invoke? Раз уж используешь ConnectionPoints, так реализуй Sink для интерфейса DWebBrowserEvents2 и ppDisp будет передаваться в твой обработчик. Дешёво и сердито.



    А если через pDispParams хочешь добираться, что ж, удачи. Вдумчиво читай описание структуры DISPPARAMS. Но камней наберёшь полные закрома.
     
  3. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    IceStudent

    Как это "реализуй Sink для интерфейса DWebBrowserEvents2"? Поясни пожалуйста.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Sink - это подписчик на события сом-объекта.



    Загляни на рсдн, почитай те статьи о Connection Points.



    Есть ещё в примерах SDK atlevent(в аттаче), там показано как разными способами реализовать Sink.



    Где-то я видел статью о ConnectionPoints, в которой показана низкоуровневая работа их (CP), оттуда на асм проще всего перевести, но я не помню, где она.



    Покопайся в atlevent, посмотри код макросов из ATL, которые там используются.



    Удачи.

    [​IMG] _1477514404__atlevent.zip
     
  5. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Спасибо за информацию! Посмотрю.
     
  6. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    А какая идея?

    Я реализую свой интерфейс, с методами которые соответствуют событиям, и потом вызываются соответствующие методы моего интерфейса?
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Именно. Ты реализуешь интерфейс полностью либо частично (наверняка не уверен), чтобы сом-объект мог вызывать твои обработчики.

    А потом подписываешь свой интерфейс с помощью ConnectionPoints.



    Только вот не помню, подписываешь то ли весь интерфейс, то ли отдельно методы — те макросы скрывают всю черновую работу.

    Скорее всего второе.
     
  8. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Это интерфейс 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

    Если я прав, то где можно узнать в какой последовательности идут методы в этом интерфейсе(в мсдн все расположенно в алфавитном порядке!!! блин!!!).
     
  9. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Да.... по этой теме в инете информации вообще нет, все что есть - на C++ какие-то макросы!!!!
     
  10. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    IceStudent

    Именно. Ты реализуешь интерфейс полностью либо частично (наверняка не уверен), чтобы сом-объект мог вызывать твои обработчики.

    Ты этим занималься? Если есть исходники кинь, пожалуйста.
     
  11. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Ура! дошло!!!!!

    Спасибо IceStudent
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Android



    Ага, интерфейс, включающий методы IDispatch и плюс DWebBrowserEvents2.





    приведи решение. если кодом, то в аттаче.