MessageHandler für IWebBrowser2, wie geht das?
-
Hallo allerseits,
ich erstelle dynamisch einen WebBrowser mit folgendem Code:
CoInitialize(NULL); hr = CoCreateInstance( CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER , IID_IWebBrowser2, (void**)&m_pBrowser); if (FAILED(hr)) return; VARIANT vEmpty; VariantInit(&vEmpty); _bstr_t bsSite = "http://www.blablabla.de"; m_pBrowser->Navigate(bsSite,&vEmpty,&vEmpty,&vEmpty,&vEmpty);
Um das Dokument zu bearbeiten, benötige ich den DownloadComplete-Handler, aber wie definiere ich den, bzw. wie erhalte ich generell auf die Events des Webbrowsers Zugriff?
Vielen Dank,
LVMH.
-
Das ist nicht ganz so einfach wie Du es Dir vorstellst, jedenfalls nicht wenn man es zu Fuß macht. Du mußt dazu selber ein Objekt implementieren, das IDispatch unterstützt. Über IDispatch::Invoke bekommst Du dann Meldung vom Browser, wenn Du die Verbindung eingerichtet hast (IConnectionPointContainer, IConnectionPont).
Ich kann Dir nur ans Herz legen, ein Hilfsmittel zu verwenden oder zu schauen, was Dir Deine IDE so bietet.
Eine ganz einfache Abhilfe, allerdings ohne Events, könnte in etwa so aussehen:
VARIANT_BOOL varBool; HRESULT hr; do { Sleep(100); hr = m_pBrowser->get_Busy(&varBool); } while((SUCCEEDED(hr)) && (varBool));
-
-King- schrieb:
Das ist nicht ganz so einfach wie Du es Dir vorstellst, jedenfalls nicht wenn man es zu Fuß macht. Du mußt dazu selber ein Objekt implementieren, das IDispatch unterstützt. Über IDispatch::Invoke bekommst Du dann Meldung vom Browser, wenn Du die Verbindung eingerichtet hast (IConnectionPointContainer, IConnectionPont).
ja, schwierig, mir fehlen da ein paar zusammenhänge, geht das nicht direkt mit dispatch? gibt es denn nicht eine anweisungsfolge, mit der ich mich zum browser connecte? so wie ich mich zum beispiel über idispatch zum dokument verbinde?
-King- schrieb:
Ich kann Dir nur ans Herz legen, ein Hilfsmittel zu verwenden oder zu schauen, was Dir Deine IDE so bietet.
visual c++ 5, ja irgendwie garnichts, jedenfalls in der hilfe hab ich nichts gefunden
-King- schrieb:
Eine ganz einfache Abhilfe, allerdings ohne Events, könnte in etwa so aussehen:
VARIANT_BOOL varBool; HRESULT hr; do { Sleep(100); hr = m_pBrowser->get_Busy(&varBool); } while((SUCCEEDED(hr)) && (varBool));
das habe ich schon versucht , aber die ausführung scheint dann nicht weiterzugehen, das heisst das programm bleibt in der schleife hängen...
Danke für deine Antwort,
LVMH.
-
ATL wäre ein Hilfsmittel. Aber du musst natürlich auch verstehen, was du zu tun hast.
-
LVMH schrieb:
ja, schwierig, mir fehlen da ein paar zusammenhänge, geht das nicht direkt mit dispatch? gibt es denn nicht eine anweisungsfolge, mit der ich mich zum browser connecte? so wie ich mich zum beispiel über idispatch zum dokument verbinde?
Doch klar, sowas gibt es:
// pUnkObject ist der IUnknown-Pointer zu Deinem WebBrowser // pUnkDisp ist der IUnknown-Pointer zu Deinem Callback-Object DWORD dwCookie; IConnectionPointContainer* pCPC = NULL; IConnectionPoint* pCP = NULL; if(SUCCEEDED(pUnkObject->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC))) { if(SUCCEEDED(pCPC->FindConnectionPoint(DIID_DWebBrowserEvents2, &pCP))) { pCP->Advise(pUnkDisp, &dwCookie); pCP->Release(); } pCPC->Release(); }
Das Trennen der Verbindung sieht genauso aus, nur das Du anstelle des Aufrufs von Advise die Methode Unadvise aufrufst. Dazu benötigst Du das Cookie, das Dir Advise liefert. Du mußt es also für später aufbewahren.
visual c++ 5, ja irgendwie garnichts, jedenfalls in der hilfe hab ich nichts gefunden
Den kenne ich nun gar nicht, kann Dir da leider nichts zu sagen.
das habe ich schon versucht , aber die ausführung scheint dann nicht weiterzugehen, das heisst das programm bleibt in der schleife hängen...
Hmh, naja. Ich hab's ehrlich gesagt auch nicht ausprobiert. Eventuell reicht es schon, wenn Du in der Schleife zusätzlich noch Nachrichten dispatched (nicht IDispatch, ich denke an DispatchMessage).