На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Как обработать событие DocumentCompleted от IWebBrowser2 в консольном приложении , IWebBrowser2, DocumentCompleted, READYSTATE_COMPLETE
    Добрый день!
    Есть консольное приложение, необходимо поймать событие DocumentCompleted которое отправит IWebBrowser2 после загрузки страницы и проверить что IWebBrowser2.ReadyState имеет READYSTATE_COMPLETE. В COM к сожалению не разбираюсь, можно хотя бы ссылку с примером подобного.
    Нашел на MSDN https://msdn.microsoft.com/en-us/library/aa...2(v=vs.85).aspx и https://msdn.microsoft.com/en-us/library/ms...7(v=vs.85).aspx
    ExpandedWrap disabled
      #include <iostream>
      #include <windows.h>
      #include <mshtml.h>
      #include <exdisp.h>
       
      void test()
      {
         if (SUCCEEDED(OleInitialize(NULL)))
         {
            
            IWebBrowser2* pBrowser2;
            CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER,
               IID_IWebBrowser2, (void**)&pBrowser2);
            if (pBrowser2)
            {
               VARIANT vEmpty;
               VariantInit(&vEmpty);
       
               VARIANT vFlags;
               V_VT(&vFlags) = VT_I4;
               V_I4(&vFlags) = navOpenInNewWindow;
       
               BSTR bstrURL = SysAllocString(L"http://ixbt.com");
               HRESULT hState = pBrowser2->Navigate(bstrURL, &vFlags, &vEmpty, &vEmpty, &vEmpty);
               READYSTATE ReadyState;
               if (SUCCEEDED(hState))
               {
                  pBrowser2->put_Visible(VARIANT_TRUE);
                  if (SUCCEEDED(pBrowser2->get_ReadyState(&ReadyState)))
                  {
                     do
                     {
                        pBrowser2->get_ReadyState(&ReadyState);
                     }
                     while (ReadyState != READYSTATE_COMPLETE);
                  }
                  std::cout << "READYSTATE_COMPLETE" << std::endl;
               }
       
               pBrowser2->Quit();
       
               SysFreeString(bstrURL);
               pBrowser2->Release();
            }
         }
      }
       
      int main()
      {
         test();
         return 0;
      }
      Общий алгоритм:
      http://stackoverflow.com/questions/2585813...om-iwebbrowser2

      Вот тут есть с примерами:
      http://www.codeguru.com/cpp/i-n/ieprogram/...et-Explorer.htm

      Вот тут рассказывается подробно о том, как устроены обработчики событий в COM:
      https://www.codeproject.com/Articles/9014/U...-Event-Handling

      Ну вот тут еще почитать можно:
      https://msdn.microsoft.com/en-us/library/bb...s.85).aspx#Sink

      Чуть позже, если время появится, попробую на твой пример прикрутить, если у тебя не получится.
        В общем нашел какой то левый пример в инете, немного его переделал под твой, вроде прилетают события. Вот готовый минимальный пример, вроде работает:
        ExpandedWrap disabled
          #include <iostream>
          #include "Exdisp.h"
          #include "Exdispid.h"
          #include <Mshtml.h>
          #include "atlbase.h"
          #include "Windows.h"
          #include "mshtmdid.h"
           
          class THtmlEventSink : public IDispatch
          {
          protected:
              long m_cRef;
          public:
              THtmlEventSink() { m_cRef = 0; }
              ~THtmlEventSink() { }
           
              HRESULT __stdcall QueryInterface(REFIID riid, void** ppvObject)
              {
                  *ppvObject = NULL;
           
                  if (IsEqualGUID(riid, IID_IUnknown))
                      *ppvObject = reinterpret_cast<void**>(this);
           
                  if (IsEqualGUID(riid, IID_IDispatch))
                      *ppvObject = reinterpret_cast<void**>(this);
           
                  if (*ppvObject)
                  {
                      ((IUnknown*)*ppvObject)->AddRef();
                      return S_OK;
                  }
                  else return E_NOINTERFACE;
              }
           
              DWORD __stdcall AddRef()
              {
                  return InterlockedIncrement(&m_cRef);
              }
           
              DWORD __stdcall Release()
              {
                  if (InterlockedDecrement(&m_cRef) == 0)
                  {
                      delete this;
                      return 0;
                  }
                  return m_cRef;
              }
           
              STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pctinfo)
              {
                  return E_NOTIMPL;
              }
           
              STDMETHOD(GetTypeInfo)(unsigned int iTInfo, LCID  lcid, ITypeInfo FAR* FAR*  ppTInfo)
              {
                  return E_NOTIMPL;
              }
           
              STDMETHOD(GetIDsOfNames)(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgDispId)
              {
                  return S_OK;
              }
           
              STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO * pExcepInfo, UINT * puArgErr)
              {
                  if (dispIdMember == DISPID_DOCUMENTCOMPLETE)
                  {
                      HRESULT hr;
                      CComQIPtr<IDispatch> disp = ((*pDispParams).rgvarg)[1].pdispVal;
                      CComPtr<IWebBrowser2> browser;
                      hr = disp->QueryInterface(IID_IWebBrowser2, (void**)&browser);
                      READYSTATE state;
                      hr = browser->get_ReadyState(&state);
                      if (state == READYSTATE_COMPLETE)
                      {
                          std::cout << "DocumentComplete Event with state READYSTATE_COMPLETE" << std::endl;
                      }
                  }
                  return S_OK;
              }
          };
           
           
           
          int main()
          {
              HRESULT hr;
              IWebBrowser2* pBrowser2;
              if (SUCCEEDED(OleInitialize(NULL)))
              {
                  CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (void**)&pBrowser2);
                  if (pBrowser2)
                  {
                      /**
                      *
                      */
                      IConnectionPointContainer* pCPC = NULL;
                      IConnectionPoint* pCP = NULL;
                      DWORD dwCookie;
                      THtmlEventSink* pUnk = new THtmlEventSink;
           
                      hr = pBrowser2->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);
                      if (SUCCEEDED(hr))
                      {
                          std::cout << "ConnectionPointContainer ok!\n";
           
                          hr = pCPC->FindConnectionPoint(DIID_DWebBrowserEvents2, &pCP);
                          if (SUCCEEDED(hr))
                          {
                              std::cout << "FindConnectionPoint DIID_DWebBrowserEvents2 ok!\n";
                              hr = pCP->Advise(pUnk, &dwCookie);
                              if (SUCCEEDED(hr))
                              {
                                  std::cout << "Event succes!\n";
                              }
                          }
                      }
           
                      VARIANT vEmpty;
                      VariantInit(&vEmpty);
                      BSTR bstrURL = SysAllocString(L"http://ixbt.com");
                      hr = pBrowser2->Navigate(bstrURL, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
           
                      if (SUCCEEDED(hr))
                      {
                          pBrowser2->put_Visible(VARIANT_TRUE);
                      }
                      else
                      {
                          pBrowser2->Quit();
                      }
                  }
              }
           
              MSG msg;
              while (GetMessage(&msg, NULL, 0, 0))
              {
                  TranslateMessage(&msg);
                  DispatchMessage(&msg);
              }
              OleUninitialize();
           
              std::cin.get();
           
              return 0;
          }


        Добавлено
        Вот еще какая то книга есть, где про это рассказывается: http://thrysoee.dk/InsideCOM+/ch08b.htm
        Сообщение отредактировано: KILLER -
          Цитата KILLER @
          вроде прилетают события.

          Ага, спасибо! То что нужно :good:
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0334 ]   [ 16 queries used ]   [ Generated: 26.04.24, 02:41 GMT ]