Avatar billede Lasse Novice
26. februar 2002 - 17:59 Der 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.
Avatar billede jpk Nybegynder
26. februar 2002 - 18:11 #1
Altså, du har indsat en webbrowser control og vil gerne modtage events som fx onclick fra den?
Avatar billede Lasse Novice
26. februar 2002 - 18:44 #2
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"
Avatar billede jpk Nybegynder
26. februar 2002 - 19:40 #3
Har du et projekt med din foreløbige kode, du kan prøve at sende til mig?
Hvis ja, kan du benytte adressen jacpost@post6.tele.dk

jeg vil lige prøve at undersøge mulighederne for at lave en kontrol der giver dig de forskellige events, men det er måske det du er ved?
Avatar billede Lasse Novice
26. februar 2002 - 20:07 #4
ja jeg har sendt filen nu. Den skulle vaere i din postkasse.

      >>jeg vil lige prøve at undersøge mulighederne for at lave en kontrol der giver dig de forskellige events, men det er måske det du er ved? >>

Ehh, jeg er ikke sikker paa hvad du mener med kontrol.
Avatar billede jpk Nybegynder
27. februar 2002 - 08:57 #5
Hmm, alle de filer og al den kode for så lidt, er det virkelig nødvendigt?
Jeg kan dog godt se hvad du vil og skal nok kigge på det...

Med kontrol, mener jeg blot at lave en klasse du kan lave en instans af og som så håndterer alt dette.
Avatar billede Lasse Novice
27. februar 2002 - 20:31 #6
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... ;-)
Avatar billede jpk Nybegynder
28. februar 2002 - 09:02 #7
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...
Avatar billede Lasse Novice
01. marts 2002 - 04:55 #8
orj, det ville vaere dejligt hvis du kunne afse lidt tid.

Jeg proever at hente MS platform SDK i morgen, saa jeg selv kan sidde og lege med det.
Avatar billede jpk Nybegynder
02. marts 2002 - 19:09 #9
Har du fået installeret SDK'en?

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:

IEnumConnectionPoints* pECP;
hr = pCPC->EnumConnectionPoints(&pECP);
ULONG Fetched;
IID pIID;
hr = pECP->Next(1, &pCP, &Fetched);
while(hr == S_OK)
{
    hr = pCP->GetConnectionInterface(&pIID);
    hr = pECP->Next(1, &pCP, &Fetched);
}
pECP->Release();

Og checke typen som pIID bliver assigned.
Avatar billede Lasse Novice
04. marts 2002 - 16:27 #10
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.

Indtil videre TAKKER for det du har gjort.
Avatar billede jpk Nybegynder
04. marts 2002 - 16:39 #11
Jeg kom lige til at læse dit indlæg fra 26/02-2002 18:44:49:
Du skriver at: "Jeg vil gerne have en loesning der giver mig onclick, onmouseover osv"

Som jeg skrev til det andet spørgsmål du havde, vil jeg mene at du kan fange all typer events ved at gøre noget lign:

<THETAG onmouseover='document.location = "app:MouseOver"; '>Place the mouse here...</THETAG>
Avatar billede Lasse Novice
04. marts 2002 - 17:09 #12
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.
Avatar billede jpk Nybegynder
04. marts 2002 - 17:36 #13
Det er rigtigt.
Det har da også været ganske sjovt at få det til at virke...
Avatar billede Lasse Novice
04. marts 2002 - 17:41 #14
hmm, jeg ved sku ikke om det er den rigtige SDK jeg har faaet ned, men under kompileringen af den nye header fil(mshtml.h), faar jeg fejlen:

error C2061: syntax error : identifier 'LONG_PTR'

Hmm, problem paa problem... Ved du hvad det er jeg mangler?
Avatar billede jpk Nybegynder
04. marts 2002 - 17:50 #15
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
Avatar billede jpk Nybegynder
04. marts 2002 - 17:51 #16
Hvad er det for en SDK du har installeret?
Avatar billede Lasse Novice
04. marts 2002 - 18:05 #17
Den jeg har hentet fra(MS_SDK 2001):

http://www.microsoft.com/msdownload/platformsdk/sdkupdate/default.htm?p=/msdownload/platformsdk/sdkupdate/psdk-full.htm

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!
Avatar billede jpk Nybegynder
04. marts 2002 - 18:13 #18
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!
Avatar billede Lasse Novice
04. marts 2002 - 18:17 #19
Og med et var der ingen fejl... Jeg kigger lige paa om funktionaliteten er der, ogsaa er der kun faa ord at sige ... MANGE TUSIND TAK
Avatar billede Lasse Novice
04. marts 2002 - 18:55 #20
ja, nu virker det bare...
Er du venlig lige at svare, saa du kan faa dine velfortjente points.

Endnu engang takker.
Avatar billede jpk Nybegynder
05. marts 2002 - 08:27 #21
Gerne, mange tak!

Har du fået det til at køre helt?
Ellers kan jeg maile mit workspace til dig...
Avatar billede Lasse Novice
05. marts 2002 - 16:23 #22
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?
Avatar billede jpk Nybegynder
05. marts 2002 - 17:22 #23
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.

BEGIN_DISPATCH_MAP(CHtmlEventSink, CCmdTarget)
    DISP_FUNCTION_ID(CHtmlEventSink, "onmouseover", DISPID_HTMLELEMENTEVENTS2_ONMOUSEOVER, OnMouseOver, VT_EMPTY, VTS_DISPATCH)
    DISP_FUNCTION_ID(CHtmlEventSink, "onclick", DISPID_HTMLELEMENTEVENTS2_ONCLICK, OnClick, VT_BOOL, VTS_DISPATCH)
END_DISPATCH_MAP()

Implementationen kan du så lave således

BOOL CHtmlEventSink::OnClick(IDispatch* pDisp)
{
    // Get a pointer to the event object
    CComQIPtr<IHTMLEventObj2> pEventObj(pDisp);

    // Get a pointer to the object that sent the event
    IHTMLElement* pElem;
    pEventObj->get_srcElement(&pElem);

    // Do something crazy, like changing the text on the button
    pElem->put_innerText(_bstr_t("New Text"));

    return TRUE;
}

void CHtmlEventSink::OnMouseOver(IDispatch* pDisp)
{
    // Get a pointer to the event object
    CComQIPtr<IHTMLEventObj> pEventObj(pDisp);
}
Avatar billede jpk Nybegynder
05. marts 2002 - 17:30 #24
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:

void CHtmlViewEx::OnDocumentComplete(LPCTSTR lpszURL)
{
    IDispatch* pDocDisp = NULL;

    // get the DOM
    pDocDisp = GetHtmlDocument();

    if(pDocDisp != NULL)
    {
        IHTMLDocument2* pDoc = NULL;
        // Obtained the document object by specifying the IHTMLDocument2 Interface.
        HRESULT hr = pDocDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDoc);
        if(SUCCEEDED(hr))
        {
            // Obtained the IHTMLDocument2 interface for the document object
            ProcessDocument(pDoc);
        }
        pDocDisp->Release();
    }           

    CHtmlView::OnDocumentComplete(lpszURL);
}

void CHtmlViewEx::ProcessDocument(IHTMLDocument2* pDoc)
{
    IHTMLElementCollection* pElemColl = NULL;

    HRESULT hr = pDoc->get_all(&pElemColl);
    if(SUCCEEDED(hr))
    {
        // Obtained element collection.
        ProcessElementCollection(pElemColl);
        pElemColl->Release();
    }
}

void CHtmlViewEx::ProcessElementCollection(IHTMLElementCollection *pElemColl)
{
    IDispatch* pElemDisp = NULL;
    IHTMLElement* pElem = NULL;
    _variant_t varID("fedepede");
    _variant_t varIdx((long)0);

    HRESULT hr = pElemColl->item(varID, varIdx, &pElemDisp);
    if(SUCCEEDED(hr) && pElemDisp)
    {
        hr = pElemDisp->QueryInterface(IID_IHTMLElement, (void**)&pElem);
        if(SUCCEEDED(hr))
        {
            // Obtained element
            ConnectEvents(pElem);
            pElem->Release();
        }
        pElemDisp->Release();
    }
}

void CHtmlViewEx::ConnectEvents(IHTMLElement *pElem)
{
    DWORD dwCookie;
    LPUNKNOWN pUnkSrc;
    HRESULT hr = pElem->QueryInterface(IID_IUnknown, (void**)&pUnkSrc);
    LPUNKNOWN pUnkSink = pHtmlEventSink->GetIDispatch(FALSE);
    AfxConnectionAdvise(pUnkSrc, DIID_HTMLButtonElementEvents2, pUnkSink, FALSE, &dwCookie);
}
Avatar billede Lasse Novice
05. marts 2002 - 18:42 #25
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.
Avatar billede jpk Nybegynder
05. marts 2002 - 18:47 #26
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
Avatar billede Lasse Novice
05. marts 2002 - 19:57 #27
takker
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester