CppWebBrowser Daten auslesen, automatische Interaktionen



  • ich betreibe ein Messgerät, das über TCP/IP mit meinem Rechner verbunden ist. Da der Hersteller nur eine Verbindung über HTTP vorgesehen hat und eine eigene Software dafür verwendet, musste ich die Werte über den TCppWebBrowser auslesen. Das funktioniert auch ganz prima. Der Haken daran ist, dass der Benutzer erst ein Passwort eingeben muss und einen OK-Button bestätigen muss bevor die Messwerte angezeigt werden, die ich dann mit dem Code (siehe unten) auslese. Schöner wäre es, wenn dies automatisch geschieht. Also müsste das Passwort ("0") in dem TCppWebBrowser eingegeben werden und der Button geklickt werden. Wie ich das bewerkstelligen könnte weiss ich nicht.

    Hier mal mein Code wie ich die Messwerte in einem TTimer auslese:

    try
       {
          IHTMLElement *HTMLElement    = NULL;
          IHTMLDocument2 *HTMLDocument = NULL;
          wchar_t *text = {0};
          VARIANT vFrame;
          VARIANT ret;
          vFrame.vt   = VT_UINT;
          vFrame.lVal = 0;
          // Falls eine Seite geladen:
          if(SUCCEEDED(frmHO->webLange->Document->QueryInterface(IID_IHTMLDocument2,(LPVOID*)&HTMLDocument)))
          {
             IHTMLFramesCollection2 *pFrames = NULL;
             if(SUCCEEDED(HTMLDocument->get_frames(&pFrames)))
             {
                if(SUCCEEDED(pFrames->item(&vFrame, &ret)))
                {
                 // Zeiger auf IHTMLWindow2 des Frames besorgen:
                 IHTMLWindow2 *pWindow = NULL;
                 if(SUCCEEDED(ret.pdispVal->QueryInterface(IID_IHTMLWindow2, (LPVOID*)&pWindow)))
                   {
                      // Zeiger auf IHTMLDocument2 des Frames besorgen:
                      IHTMLDocument2 *pDoc = NULL;
                      if(SUCCEEDED(pWindow->get_document(&pDoc)))
                      {
                         pDoc->get_body(&HTMLElement);
                         HTMLElement->get_innerText(&text);
                         pDoc->Release();
                      }
                      pWindow->Release();
                   }
                }
             pFrames->Release();
             }
             HTMLDocument->Release();
          }
          //Daten extrahieren
          AnsiString temp = text;
          DecimalSeparator  = '.';
          ph	   = StrToFloat(temp.SubString(temp.Pos("000611431208")+16,4));
          redox = StrToFloat(temp.SubString(temp.Pos("000608430487")+21,4).Trim());
          DecimalSeparator = ',';
          txtAnzeigeLangeStatus->Text = "verbunden";
       }
       catch(...)
       {
       	ph    = 0;
          redox = 0;
          txtAnzeigeLangeStatus->Text = "nicht verbunden";
       }
    

    ph und redox sind die Messwerte und sind in der Form als private deklariert. Besser fände ich es wenn das alles dann in einer Threadklasse steht, so dass ich dann die Messwerte über einen Timer hole.
    Evtl soll dann noch eine Prüfung mit rein ob die Verbindung hergestellt werden konnte, damit ich dies dann über ein Statusfeld dem Benutzer anzeigen kann. (Habe dafür einfach immer ein rundes Shape genommen, dass entweder grün oder rot ist)





  • ja genau. Das wäre die Lösung. Ich wollt das grad mal mit google ausprobieren und eine Suche über eine InputBox starten. Nun komm ich nicht weiter.

    Was ist IHTMLDocument2 für ein Datentyp?
    Die Methode SUCCEEDED kenn ich auch nicht. Die Hilfe spuckt dazu leider nichts aus.
    Auch viele andere Sachen sind mir in dem Code unbekannt.
    Wie müsste der Code ausshene für eine Eintragung eines Wertes in das Suchfeld sowie die Ausführung der Suche?

    Das hab ich bis jetzt:

    void __fastcall TForm1::btnSuchenClick(TObject *Sender)
    {
    	browser->Navigate(WideString("http://www.google.de"));
    
       while(!browser->Busy)
       	Application->ProcessMessages();
      	while(browser->Busy)
       	Application->ProcessMessages();
    
       labStatus->Caption = "Status: " + browser->LocationURL + " wurde erfolgreich"
       	 " geladen!";
    
      	if(browser->LocationURL != WideString("http://www.google.de/"))
      	{
    		ShowMessage("Seite http://www.google.de konnte nicht geladen werden !");
        	return;
      	}
    
       // Suchstring eingeben lassen:
    	WideString suchString = InputBox("Suche auf google",
       	"Bitte geben Sie den Suchbegriff ein:", "Tier");
    
       if(suchString == EmptyStr)
    		return;
    
       IHTMLDocument2 *htmlDokum = NULL;
    
    	if(SUCCEEDED(browser->Document->QueryInterface(IID_IHTMLDocument2,
       	(LPVOID*)&htmlDokum))) // falls eine Seite geladen
    	{
      		IHTMLElementCollection *pAll = NULL;
    
      		if(SUCCEEDED(htmlDokum->get_all(&pAll)))
      		{
        		TVariant name    = "q";
        		IDispatch *pDisp = NULL;
        		TVariant index   = 0;
    
        		if(SUCCEEDED(pAll->item(name, index, &pDisp)))
        		{
          		if(pDisp)
          		{
            			IHTMLInputElement *pInput = NULL;
            			pDisp->QueryInterface(IID_IHTMLInputElement, (LPVOID*)&pInput);
            			pDisp->Release();
    
            			if(pInput)
            			{
             			WideString mybuffer;
              			pInput->put_value(suchString);
            			}
            			pInput->Release();
          		}
        		}
      		}
      		pAll->Release();
    	}
    	htmlDokum->Release();
    }
    

    Das Eintragen des Wertes funktioniert bereits. Nun muss ich den Button auf der google-Seite (Google-Suche noch drücken lassen.)



  • ich hab zwar nicht genau verstanden wie der Code funktioniert aber habs hinbekommen:

    Nach Eingabe des Suchstrings wird dieser eingetragen und die Suche wird ausgeführt.

    void __fastcall TForm1::btnSuchenClick(TObject *Sender)
    {
    	browser->Navigate(WideString("http://www.google.de"));
    
       while(!browser->Busy)
       	Application->ProcessMessages();
      	while(browser->Busy)
       	Application->ProcessMessages();
    
       labStatus->Caption = "Status: " + browser->LocationURL + " wurde erfolgreich"
       	 " geladen!";
    
      	if(browser->LocationURL != WideString("http://www.google.de/"))
      	{
    		ShowMessage("Seite http://www.google.de konnte nicht geladen werden !");
        	return;
      	}
    
       // Suchstring eingeben lassen:
    	WideString suchString = InputBox("Suche auf google",
       	"Bitte geben Sie den Suchbegriff ein:", "Tier");
    
       if(suchString == EmptyStr)
    		return;
    
       IHTMLDocument2 *htmlDokum = NULL;
    
    	if(SUCCEEDED(browser->Document->QueryInterface(IID_IHTMLDocument2,
       	(LPVOID*)&htmlDokum))) // falls eine Seite geladen
    	{
      		IHTMLElementCollection *pAll = NULL;
    
      		if(SUCCEEDED(htmlDokum->get_all(&pAll)))
      		{
        		TVariant name    = "q";
        		IDispatch *pDisp = NULL;
        		TVariant index   = 0;
    
        		if(SUCCEEDED(pAll->item(name, index, &pDisp)))
        		{
          		if(pDisp)
          		{
            			IHTMLInputElement *pInput = NULL;
            			pDisp->QueryInterface(IID_IHTMLInputElement, (LPVOID*)&pInput);
            			pDisp->Release();
    
            			if(pInput)
            			{
             			WideString mybuffer;
              			pInput->put_value(suchString);
            			}
            			pInput->Release();
          		}
        		}
      		}
      		pAll->Release();
    	}
    
       // Formulareingaben abschicken (SUBMIT)
    	IHTMLElementCollection *HTMLForms = NULL;
    	if(SUCCEEDED(htmlDokum->get_forms(&HTMLForms)) && HTMLForms)
    	{
    		// Name des HTML-Formulars <form name="SearchForm"...>
    		TVariant name = "f";
    		TVariant index = 0;
    		IDispatch *pDisp = NULL;
    
            if(SUCCEEDED(HTMLForms->item(name, index, &pDisp)) && pDisp)
            {
              IHTMLFormElement *HTMLForm = NULL;
              if(SUCCEEDED(pDisp->QueryInterface(IID_IHTMLFormElement,
                (LPVOID*)&HTMLForm)) && HTMLForm)
              {
                HTMLForm->submit();
                HTMLForm->Release();
              }
              pDisp->Release();
            }
            HTMLForms->Release();
          }
    
    	htmlDokum->Release();
    }
    

Anmelden zum Antworten