Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Browser "steuern" mit Lazarus (https://www.delphipraxis.net/121734-browser-steuern-mit-lazarus.html)

Glocke89 3. Okt 2008 12:59


Browser "steuern" mit Lazarus
 
Hallo zusammen

(hoffentlich ist das hier der richtige Bereich^^)

Ich möchte mit Lazarus meinen Browser bzw. einen Tab oder ein Fenster im Browser steuern.
Browser: Mozilla Firefox 3.0.3 (jeder andere Browser wäre mir auch recht aber FF würde ich bevorzugen)
IDE: Lazarus Free Pascal 0.9.22 Beta

Unter "steuern" verstehe ich:
  • Öffnen von Links (über Adressleiste eintragen und "Enter drücken")
  • Suchen von Code-Stücken im HTML-Quellcode bzw. Auslesen des Quellcodes in ein Memo (dann kann ich ja selber drinne normal suchen)
  • Ausfüllen von Formularen (also solche Eingabefelder zB mit Zahlen füllen) (--> Eingabefelder sind über JavaScript)
  • Buttons Klicken (--> Buttons sind über JavaScript)

Das ganze ginge sicher auch über JavaScript irgendwie zu machen aber ich bin ehrlich gesagt zu faul mich mit JavaScript auseinanderzusetzen. Und da ich am besten Ahnung von Pascal / Object Pascal / Delphi (oder wie immer man das nenne will) habe, möchte ich es damit machen.

Was ich suche:
  • Downloadmöglichkeit für vorgefertigte Komponenten (--> Browser überhaupt erstmal ansteuern können), die Lazarus-Seite hilft mir da kaum weiter
  • ein Tutorial wie ich mit den Komponenten arbeite (eine Auflistung von Methoden etc. würde mich auch helfen - grundlegende Kenntnisse im Umgang mit Objekten habe ich).

Also wer was hat dann immer rein damit :dp:

TurboMartin 3. Okt 2008 13:23

Re: Browser "steuern" mit Lazarus
 
Liste der Anhänge anzeigen (Anzahl: 1)
Für den IE könnte ich dir mit folgendem helfen:

Delphi-Quellcode:
type
  TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; wParam: wParam; out pObject): HRESULT; stdcall;

function TfrmMain.GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT;
var
  hInst: HWND;
  lRes: Cardinal;
  Msg: Integer;
  pDoc: IHTMLDocument2;
  ObjectFromLresult: TObjectFromLresult;
begin

  //OLE-DLL laden
  hInst := LoadLibrary('Oleacc.dll');
  @ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult');

  //geladen?
  if @ObjectFromLresult <> nil then
  begin

    try

      //Message-Handler
      Msg := RegisterWindowMessage('WM_HTML_GETOBJECT');
      SendMessageTimeOut(WHandle, Msg, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
      Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);

      //Rückgabe
      if Result = S_OK then
        (pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp,
          IWebbrowser2, IE);

    finally

      //OLE-DLL entladen
      FreeLibrary(hInst);
    end;
  end;
end;

procedure Work(Sender: TObject);
var
  wndMain: hWnd;
  wndChild: hWnd;
  htmldDocument: IHtmlDocument2;
  iwbIE: IWebBrowser2;
  htmleBodyCode: IHTMLElement;
begin
  //IE suchen
  wndMain := FindWindow('IEFrame', nil);
  if wndMain <> 0 then
  begin

    //Tab suchen, welcher sich zur Zeit im Vordergrund befindet
    wndChild := FindWindowEx(wndMain, 0, 'TabWindowClass', nil);
    wndChild := FindWindowEx(wndChild, 0, 'Shell DocObject View', nil);
    wndChild := FindWindowEx(wndChild, 0, 'Internet Explorer_Server', nil);

    //Tab gefunden?
    if wndChild <> 0 then
    begin

      //IEInterface bekommen
      GetIEFromHWnd(WndChild, iwbIE);
      if iwbIE <> nil then
      begin

        //hier kannst du dann mit iwbIE arbeiten
      end;
    end;
  end;
end;

Glocke89 3. Okt 2008 13:37

Re: Browser "steuern" mit Lazarus
 
Klingt schonmal relativ kompliziert :|
In der pas-Datei seh ich nicht wirklich durch ...
Aber der Code den du gepostet hast, der ist verständlich :mrgreen:
Kannst du mir vielleicht sagen wie ich zB an den Quellcode des im aktiven Tab befindlichen HTML-Dokumentes komme (mit welcher Methode etc.) oder eine URL in einen Tab lade?

TurboMartin 3. Okt 2008 14:00

Re: Browser "steuern" mit Lazarus
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
while iwbIE.ReadyState <> 4 do //ka ob das so jetzt richtig ist
  Application.ProcessMessages;

htmldDocument := iwbIE.Document as IHtmlDocument2;
while htmldDocument.ReadyState <> 'complete' do
  Application.ProcessMessages;

htmlBodyCode := htmldDocument.body;
Damit hast Du jetzt den HTML-Body.

Die Unit aus dem ersten Beitrag, und die ich jetzt nch angehangen habe (leider vergessen) musst Du nur einbinden(beides Typlib).

Glocke89 3. Okt 2008 14:10

Re: Browser "steuern" mit Lazarus
 
Zitat:

Zitat von TurboMartin
Damit hast Du jetzt den HTML-Body.

In welcher Form (sorry wenn die Frage blöd ist ^^).
Von welchem Typ ist htmleBodyCode? Kann ich den Inhalt in ein Memo-Feld ausgeben? Wenn ja wie?
(Aber ich glaube schonmal das geht in die Richtung wie ich es angedacht habe).

TurboMartin 3. Okt 2008 14:17

Re: Browser "steuern" mit Lazarus
 
htmleBodyCode.innerHTML ist ein WideString

Glocke89 3. Okt 2008 14:19

Re: Browser "steuern" mit Lazarus
 
Inwiefern ist ein Widestring mit Memo.Lines (müsste TStrings oder so sein) kompatibel?

/EDIT: Kann mir einer aus dem Stehgreif sagen, wie ich die beiden *.pas einbinde? Hab sowas noch nie gemacht :?

TurboMartin 3. Okt 2008 14:23

Re: Browser "steuern" mit Lazarus
 
So wie ich das weiß, müsste das ganz einfach mit String := WideString gehen.

Delphi-Quellcode:
uses
  ActiveX, Shdocvw_tlb, MSHTML_TLB;

Glocke89 3. Okt 2008 14:36

Re: Browser "steuern" mit Lazarus
 
Hab das eben mal versuchen wollen aber es kommen nur zwei Fehler:
Zitat:

Shdocvw_tlb.pas(55,2) Warning: Illegal compiler directive "$VARPROPSETTER"
Shdocvw_tlb.pas(1,1) Fatal: Can't find unit OleCtrls
/EDIT: bezieht sich beides auf SHDocVw_TLB.pas

TurboMartin 3. Okt 2008 14:45

Re: Browser "steuern" mit Lazarus
 
Zitat:

Zitat von Glocke89
Hab das eben mal versuchen wollen aber es kommen nur zwei Fehler:
Zitat:

Shdocvw_tlb.pas(55,2) Warning: Illegal compiler directive "$VARPROPSETTER"
Aus der Hilfe:

Die Compiler-Direktive VARPROPSETTER ist aktiviert. Dies ermöglicht die Verwendung des Schlüsselworts var in der Parameterliste der Methoden zum Setzen der Eigenschaft. Dadurch wird eine Compiler-Optimierung deaktiviert, die eine Übergabe von Parametern per Wert statt per Referenz verursachen würde. Die Direktive VARPROPSETTER muss bei der Erstellung von TLB-Units für Komponenten aktiviert sein, die in einer anderen Sprache als Delphi programmiert sind.

Daher, du müsstest mal schauen ob es eine andere dafür bei Lazarus zu finden ist. Ansonsten probier mal diese zu deaktieviren (Irgendwas vors $ schreiben oder das $ wegmachen
Zitat:

Zitat von Glocke89
Shdocvw_tlb.pas(1,1) Fatal: Can't find unit OleCtrls

/EDIT: bezieht sich beides auf SHDocVw_TLB.pas

Tja, OleCtrls ist aus der VCL. Aber Du müsstest eine ähnliche Unit auch bei Lazarus finden. Bind einfach mal alle mit Ole im Namen ein :mrgreen:

Glocke89 3. Okt 2008 14:50

Re: Browser "steuern" mit Lazarus
 
Die einzige "Ole" die ich gefunden habe ist die hier:
Delphi-Quellcode:
{
    This file is part of the Free Pascal run time library.
    Copyright (c) 1999-2000 by the Free Pascal development team.

    Implemtents some stuff of OLE2, tries to be Delphi compatible

    See the file COPYING.FPC, included in this distribution,
    for details about the copyright.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 **********************************************************************}
unit ole2;

{$Mode ObjFpc}

  interface

    uses
       windows;

    type
       IUnknown = class
         public
           function QueryInterface(const iid: TIID; var obj): HResult; virtual; {$ifndef VER0_99_10}stdcall;{$endif} abstract;
           function AddRef: Longint; virtual; {$ifndef VER0_99_10}stdcall;{$endif} abstract;
           function Release: Longint; virtual; {$ifndef VER0_99_10}stdcall;{$endif} abstract;
       end;

  implementation

end.
Das trifft die Sache glaube nicht, oder?

/EDIT: ich hab ja noch Delphi7 aufm Rechner drauf und da gibt es eine OleCtrls.dcu aber die scheint nicht zu funktionieren (hab sie ins Verzeichnis des Lazarus-Projektes kopiert aber er findet sie weiterhin nicht -.- )

TurboMartin 3. Okt 2008 16:10

Re: Browser "steuern" mit Lazarus
 
Zitat:

Zitat von Glocke89
Die einzige "Ole" die ich gefunden habe ist die hier:
Delphi-Quellcode:
{
    This file is part of the Free Pascal run time library.
    Copyright (c) 1999-2000 by the Free Pascal development team.

    Implemtents some stuff of OLE2, tries to be Delphi compatible

    See the file COPYING.FPC, included in this distribution,
    for details about the copyright.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 **********************************************************************}
unit ole2;

{$Mode ObjFpc}

  interface

    uses
       windows;

    type
       IUnknown = class
         public
           function QueryInterface(const iid: TIID; var obj): HResult; virtual; {$ifndef VER0_99_10}stdcall;{$endif} abstract;
           function AddRef: Longint; virtual; {$ifndef VER0_99_10}stdcall;{$endif} abstract;
           function Release: Longint; virtual; {$ifndef VER0_99_10}stdcall;{$endif} abstract;
       end;

  implementation

end.
Das trifft die Sache glaube nicht, oder?

/EDIT: ich hab ja noch Delphi7 aufm Rechner drauf und da gibt es eine OleCtrls.dcu aber die scheint nicht zu funktionieren (hab sie ins Verzeichnis des Lazarus-Projektes kopiert aber er findet sie weiterhin nicht -.- )

Dann solltest Du auf D7 umsteigen, da ActiveX nicht CrossPlatform ist, und damit nicht so wichtig für das Entwicklerteam.

Glocke89 3. Okt 2008 16:22

Re: Browser "steuern" mit Lazarus
 
Das Problem ist, dass der Spaß da auch nicht funktioniert (das ist scheinbar 'ne abgespeckte Schülerversion *lol* )

TurboMartin 3. Okt 2008 18:39

Re: Browser "steuern" mit Lazarus
 
Zitat:

Zitat von Glocke89
Das Problem ist, dass der Spaß da auch nicht funktioniert (das ist scheinbar 'ne abgespeckte Schülerversion *lol* )

Was funktioniert denn genau nicht? Wenn Du das mal sagst, können wir/ich dir helfen.

Glocke89 3. Okt 2008 22:51

Re: Browser "steuern" mit Lazarus
 
Es werden diverse Komponenten nicht gefunden.

(u.A. kann ich dort wo ich auswähle ob Konsolenanwendung oder DLL oder sonst was kein ActiveX auswählen - ist nicht da).

TurboMartin 4. Okt 2008 08:54

Re: Browser "steuern" mit Lazarus
 
Dafür brauchst Du nur eine VCL-Formularanwendung oder eine Konsolenanwendung, kein ActiveX.

Glocke89 4. Okt 2008 14:17

Re: Browser "steuern" mit Lazarus
 
Hmm naja egal. Das muss ja eigentlich auch mit Lazarus gehen ... begrenzendes Element scheinen die Komponenten zu sein :?

TurboMartin 6. Okt 2008 11:09

Re: Browser "steuern" mit Lazarus
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, ich hab hier mal ein Beispiel gemacht, welches mit dem IE7 funktionieren sollte (beim IE8 funktionierts leider nicht, werde es dafür aber auch noch umschreiben).
Das Beispiel manipuliert den Body der zuletzt im Vordergrund gewesenen Registerkarte.

[edit]Für den IE8 muss die Zeile
wndChild := FindWindowEx(wndMain, 0, 'TabWindowClass', nil);
durch
wndChild := FindWindowEx(wndMain, 0, 'Frame Tab', nil);
wndChild := FindWindowEx(wndChild, 0, 'TabWindowClass', nil);

ersetzt werden[/edit]

Glocke89 6. Okt 2008 15:55

Re: Browser "steuern" mit Lazarus
 
Erstmal danke aber das nützt mir in der Form nix weil ich ja Lazarus benutze und dort nicht alle Units zur Verfügung habe.

/EDIT: *.dcu zu *.pas decompilieren?
/EDIT2: bei TurboPascal waren die Units als *.pas dabei. Bin eben dran die im Lazarus zu verwenden ... *durcharbeit*
/EDIT3: und wie erwartet : Lazarus will die Units nicht haben. Naja egal, jetzt wo ich die Dinger eh habe kann ich das auch mit Delphi machen xD
Zur Information: Delphi 7 Personal.

Hab mir vorhins mozilla active x runtergeladen und es geschafft einen kleinen Browser zusammenzubauen.
Kann ich nun wie oben genannt den Quellcode etc. auslesen? *ausprobier*


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz