26. februar 2002 - 17:59Der er
26 kommentarer og 1 løsning
Webbrowser og sinking events
Jeg er ved at rive haaret ud paa mig selv. Jeg skal have lavet et program der sinker de events som kommer fra webbrowseren. Jeg kan finde ud af pt at uddrive vaerdier fra webbrowseren, simulere onclick og meget andet. Men naar det kommer til at jeg skal modtage en event, saa er det en hel anden sag. Hvis der er nogen der har lavet et eller andet med det foer(jf. evt. http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/mshtml/tutorials/sink.asp) og hvor det virker, vil jeg genre spytte de sidste point I jeg har. Jeg kan simpelthen ikke finde ud af hvordan det goeres. Jeg arbejder paa en XP med VC6++, saa det skal selvfoelgelig virke dertil.
Ja, jeg ved at jeg har haft mere eller mindre det samme spg foer. Du svarede, og jeg var ikke tilfreds med svaret, da det kun var baseret paa onclick. Jeg vil gerne have en loesning der giver mig onclick, onmouseover osv. Det kan goeres vha den URL som jeg har givet opover. Jeg har proevet paa det, og er der faktisk naesten. Men jeg ved fanme ikke hvordan jeg "kommer over maalstregen"
hehe... undskyld hvis jeg kom til at sende for meget. Det var i hvert fald ikke meningen. Jeg haaber virkelig at du kan finde ud af hvad jeg goer forkert, da jeg virkelig er begyndt at miste haar... ;-)
Du må undskylde jeg ikke har nået at finde en løsning, men jeg har lidt travl på arbejde for tiden...
Jeg har dog fundet ud af følgende: DIID_HTMLElementEvents2 er ikke defineret i den version af mshtml.h der installeres sammen med VC++, men hvis du installerer MS Platform SDK, kan du kompilere uden fejl!
Dog returnerer kaldet: hr = pCPC->FindConnectionPoint(DIID_HTMLElementEvents2, &pCP); -2147467262, hvilket betyder: No such interface supported.
Jeg skal nok prøve at finde lidt tid til at se på det...
Jeg har fundet ud af at du skal bruge: hr = pCPC->FindConnectionPoint(DIID_HTMLButtonElementEvents2, &pCP); istedet for: hr = pCPC->FindConnectionPoint(DIID_HTMLElementEvents2, (void**)&pCP); til knapper. De understøtter ikke det mere generelle interface, IHTMLElementEvents2.
Du kan finde ud af hvilke connectionpoints et HTML-element understøtter, på følgende måde:
hehe, ja jpk, jeg har LIGE faaet hentet det ned. I mexico hvor jeg bor er der stroemafbrydelser hver femte time(eller lign), saa naar man saetter noget til at downloade, skal man vaere lidt a la bigbrother for at faa hentet det hele ned. Samtidig med det, er det laaaaaangsomt af h... til, saa derfor er det foerst kommet ned nu. Jeg kigger HELT sikkert paa det idag.
ja, jeg har lige selv opdaget det... Vi er nemlig 2 personer der kigger paa dette, og ham den anden har loest det vha dette. Dette er faktisk lige sket nu. Men nu er jeg jo lidt staedig, saa jeg vil nu gerne lige faa adsluttet dette kapitel og faa gjort det med event sinking. Med det kan man jo ogsaa faa ALLE events. Jeg ved nu ikke om jeg skal bruge det til noget, men hvad fanden.
Header filen skal ikke kompileres, blot includes. Har du sat stien til SDK'en øverst under Tools->Option på fanebladet Directories?
Du skal gøre det for de forskellige typer du finder i comboboxen under "Show directories for:". Det er dog ikke sikkert der er nogen entry under "Source files". Du kan gøre det ved bare at trække entries'ne op i listen
Jeg inkluderer header filen, og det er saadan set det. Jeg har kigget lidt paa nettet, og det siger at LONG_PTR er def. i BaseTsd.h. Den har jeg kigget i, og det er rigtigt nok. Selvom jeg inkluderer denne foer mshtml.h(i min stdafx.h), saa faar jeg stadig fejlen. Jeg har gjort det med at adde stien i tools->option osv. Ingen forskel!
Du skal IKKE tilføje stien under Tools->Option, du skal sørge for at de entries der er lavet af SDK-installationen, står øverst!
Disse 2 entries er fx tilføjet hos mig, under "Executable files" (skal du vælge i en combobox) C:\Program Files\Microsoft Platform SDK\bin\winnt C:\Program Files\Microsoft Platform SDK\bin
Under "Include files" er der tilføjet: C:\Program Files\Microsoft Platform SDK\include
osv....
Dem kan du flytte øverst ved at trække med musen. Det er afgørende at de står øverst!
nej, jeg har ikke faaet det HELT op at koere... faktisk. Inde paa micros hjemmeside http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/mshtml/tutorials/sink.asp viser de nederst paa siden et eksempel(via show example) paa hvordan man "detect the firing of an HTMLElementEvents2::onclick event". Det kan jeg faktisk ikke faa til at virke, men jeg har faaet det til at virke paa en anden maade. Har du det til at virke?
Ja, det er en stor pærevælling med forskellige metoder - ikke til at finde rundt i! Faktisk er det ret elendigt beskrevet, jeg savnede selv nogle bedre eksempler.
Hvis du hentyder til at eksemplet med at fange onclick via IDispatch::Invoke, så glem det! Du har jo nedarvet din sink-klasse fra CCmdTarget, som implementerer IDispatch, altså giver det ingen mening... Det du skal gøre er, følgendende:
I din .cpp-fil laver du en DISP_FUNCTION entry for hvert event du vil fange.
Hvad angår selve koden til at hooke op til connection points, kan det gøres lidt mere simpelt. Check MFC metoden AfxConnectionAdvise, den sparer dig for nogle linier... Herunder kan du se min implementation:
ja, det du skriver med DISP_FUNCTION er faktisk ogsaa saadanne jeg goer.
Det jeg savner ved dette er hvilke parametre jeg skal give til DISP_FUNCTION, men det ligger vel et eller andet sted paa nettet. Jeg skal bare lige soege lidt.
I filen mshtmdid.h, som du også skal include, kan du finde disp id'erne, som fx DISPID_HTMLELEMENTEVENTS2_ONMOUSEOVER
For at se hvad de enkelte funktioner returnerer og hvilke input argumenter de har, kan du åbne filen winnt\system32\mshtml.tlb i VC's OLE/COM viewer. Du skal så finde det interface du vil kigge på, i venstre side, fx IHTMLButtonElementEvents2
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.