Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.142.200.226] |
|
Сообщ.
#1
,
|
|
|
Добрый день!
Есть консольное приложение, необходимо поймать событие 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 #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; } |
Сообщ.
#2
,
|
|
|
Общий алгоритм:
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 Чуть позже, если время появится, попробую на твой пример прикрутить, если у тебя не получится. |
Сообщ.
#3
,
|
|
|
В общем нашел какой то левый пример в инете, немного его переделал под твой, вроде прилетают события. Вот готовый минимальный пример, вроде работает:
#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 |
Сообщ.
#4
,
|
|
|
Цитата KILLER @ вроде прилетают события. Ага, спасибо! То что нужно |