Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi URLs aus Firefox-Instanzen auslesen (https://www.delphipraxis.net/40651-urls-aus-firefox-instanzen-auslesen.html)

Wannabe 18. Feb 2005 21:14


URLs aus Firefox-Instanzen auslesen
 
Hallo,

ich arbeite zur Zeit an einem Programm dass letztendlich einmal eine Art von persönlichem, zentralem "Internetcenter" darstellen soll, sprich mit eigenem Browser und maximaler Konfigurierbarkeit, erweiterten Möglichkeiten zur Verwaltung von Favoriten, Verlauf etc.

Im Moment sitze ich gerade daran einen zentralen Verlauf zu programmieren der so funktionieren soll dass er mitliest welche URLs aufgerufen werden und diese nach Bedarf - je nach Einstellung - abspeichert, verschiebt oder auch erst konfiguriert und dann abspeichert. Für den IE habe ich zum Auslesen der URLs aller Instanzen folgende Methode benutzt:

Code:
uses shdocvw;

procedure TForm1.Button2Click(Sender: TObject);
var
  x: Integer;
  Sw: IShellWindows;
begin
  sw := CoShellWindows.Create;
  for x := 0 to SW.Count - 1 do
    Listbox1.Items.Add((Sw.Item(x) as IWebbrowser2).LocationUrl);
end;
Das Ganze funktioniert auch reibungslos, jedoch leider nur für den IE. Da aber ebenso der Firefox weitverbreitet ist möchte ich das selbe für diesen Browser implementieren, finde dazu jedoch keinen Ansatz. :(

Weiß jemand Rat ?

Wannabe 21. Feb 2005 20:58

Re: URLs aus Firefox-Instanzen auslesen
 
Hat denn niemand eine Idee :(

Ich habe zum Auslesen von URLs des Internet Explorer noch folgenden Quellcode gefunden:

Delphi-Quellcode:
uses
  ActiveX, Shdocvw_tlb, MSHTML_TLB;

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

function GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT;
var
  hInst: HWND;
  lRes: Cardinal;
  MSG: Integer;
  pDoc: IHTMLDocument2;
  ObjectFromLresult: TObjectFromLresult;
begin
  hInst := LoadLibrary('Oleacc.dll');
  @ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult');
  if @ObjectFromLresult <> nil then begin
    try
      MSG := RegisterWindowMessage('WM_HTML_GETOBJECT');
      SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
      Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
      if Result = S_OK then
        (pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE);
    finally
      FreeLibrary(hInst);
    end;
  end;
end;

procedure GetIEWindows(lb: TListBox);
  function EnumWindowsProc (Wnd: HWND; lb: TListBox): BOOL; stdcall;
  var
    theClassname: array [0..128] of Char;
    caption: Array [0..128] of Char;
    IE: IWebbrowser2;
    WndChild: HWND;
  begin
    Result := True;
    Windows.GetClassname( Wnd, theClassname, Sizeof( theclassname ));
    if theClassname='IEFrame' then
    begin
      WndChild := FindWindowEX(Wnd, 0, 'Shell DocObject View', nil);
      if WndChild <> 0 then
      begin
        WndChild := FindWindowEX(WndChild, 0, 'Internet Explorer_Server', nil);
        if WndChild <> 0 then
        begin
          if GetIEFromHWND(WndChild, IE)=S_OK then
            if IE<>nil then
              lb.Items.Add(IE.LocationURL);
        end;
      end;
    end;
  end;
begin
  lb.Clear;
  EnumWindows(@EnumWindowsProc, integer(lb));
end;
Aufrufen kann man dann ganz einfach über

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  GetIEWindows(ListBox1);
end;
Allerdings funktioniert das Ganze wieder nur für den IE :( Würde es vielleicht funktionieren wenn man das 'Internet Explorer_Server' durch den Namen des Firefox ersetzen würde ? 'Firefox' und 'Mozilla Firefox' haben jedenfalls nicht geklappt
:( :( :(

Luckie 21. Feb 2005 21:00

Re: URLs aus Firefox-Instanzen auslesen
 
Zitat:

Zitat von Wannabe
Allerdings funktioniert das Ganze wieder nur für den IE

Ist ja auch irgendwie logisch. Du benutzt ja auch das ActiveX bzw. die Typbibliothek des IE.

Aber ich meine, wir hatten das schon mal mit dem Firefox. Benutzt mal die Forensuche.

Wannabe 23. Feb 2005 15:44

Re: URLs aus Firefox-Instanzen auslesen
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von Wannabe
Allerdings funktioniert das Ganze wieder nur für den IE

Ist ja auch irgendwie logisch. Du benutzt ja auch das ActiveX bzw. die Typbibliothek des IE.

Aber ich meine, wir hatten das schon mal mit dem Firefox. Benutzt mal die Forensuche.

Hi Luckie,

ich habe die Forensuche mit "Firefox AND URL" gefüttert, allerdings in den Ergebnissen nicht wirklich etwas passendes gefunden.
:( Bist du sicher dass es schon einmal etwas in der Richtung in diesem Forum gab ?

toms 23. Feb 2005 15:48

Re: URLs aus Firefox-Instanzen auslesen
 
Hi,

Probiere mal diese Funktion:

Delphi-Quellcode:
procedure GetCurrentURL(out URL, Title: string);
var
   DDEClient : TDDEClientConv;
   p, q: PChar;
   i: Integer;
begin
   DDEClient := TDDEClientConv.Create(nil);
   try
     with DDEClient do if SetLink('IExplore', 'WWW_GetWindowInfo') or
       SetLink('Netscape', 'WWW_GetWindowInfo') or
       SetLink('Mosaic', 'WWW_GetWindowInfo') or
       SetLink('Netscp6', 'WWW_GetWindowInfo') or
       SetLink('Mozilla', 'WWW_GetWindowInfo') or
       SetLink('Firefox', 'WWW_GetWindowInfo') then
       p := RequestData('0xFFFFFFFF')
     else raise Exception.Create('Could not establish browser DDE link');
     if Assigned(p) then try
       q := p;
       Assert(q^ = '"');
       SetLength(URL, StrLen(q));
       Inc(q);
       i := 0;
       while q^ <> '"' do begin
         if (q^ = '\') and (q[1] = '"') then Inc(q);
         Inc(i);
         URL[i] := q^;
         Inc(q);
       end;
       SetLength(URL, i);
       SetLength(Title, StrLen(q));
       i := 0;
       Inc(q, 3);
       while q^ <> '"' do begin
         if (q^ = '\') and (q[1] = '"') then Inc(q);
         Inc(i);
         Title[i] := q^;
         Inc(q);
       end;
       SetLength(Title, i);
     finally
       StrDispose(p);
     end else raise Exception.Create('Could not fetch browser data');
   finally
     DDEClient.Free;
   end;
end;

Wannabe 6. Mär 2005 18:28

Re: URLs aus Firefox-Instanzen auslesen
 
Hi,

super, die Procedure funktioniert :dp:
Habe sie nur etwas umgeändert damit das Programm nicht beendet wird wenn kein Browser offen ist.

Nun versuche ich gerade die Prozedur so umzustellen, dass alle Instanzen ausgelesen werden. Klappt aber noch nicht so wirklich :(

sniper_w 6. Mär 2005 19:50

Re: URLs aus Firefox-Instanzen auslesen
 
Welche Units muss man einbinden, damit es auch mit dem Kompilieren klappt. :roll:

Wannabe 6. Mär 2005 20:18

Re: URLs aus Firefox-Instanzen auslesen
 
Zitat:

Zitat von sniper_w
Welche Units muss man einbinden, damit es auch mit dem Kompilieren klappt. :roll:

Die "ddeman"-Unit.

sniper_w 6. Mär 2005 20:20

Re: URLs aus Firefox-Instanzen auslesen
 
Danke.

Tubos 6. Mär 2005 20:23

Re: URLs aus Firefox-Instanzen auslesen
 
Zitat:

Im Moment sitze ich gerade daran einen zentralen Verlauf zu programmieren der so funktionieren soll dass er mitliest welche URLs aufgerufen werden und diese nach Bedarf - je nach Einstellung - abspeichert, verschiebt oder auch erst konfiguriert und dann abspeichert.
Ich würde das mit einem Proxy machen, der zwischen Router und LAN steht. Kostet wenig (irgendein alter Rechner, Linux + Squid drauf, fertig)und bietet eine hohe Sicherheit. Bei Bedarf kannst du so auch Seiten sperren und div. andere Spielereien machen.

Wannabe 7. Mär 2005 22:08

Re: URLs aus Firefox-Instanzen auslesen
 
Zitat:

Zitat von Tubos
Ich würde das mit einem Proxy machen, der zwischen Router und LAN steht. Kostet wenig (irgendein alter Rechner, Linux + Squid drauf, fertig)und bietet eine hohe Sicherheit. Bei Bedarf kannst du so auch Seiten sperren und div. andere Spielereien machen.

Bei Aufbau eines Netzwerkes würde ich es auch sofort so machen, allerdings möchte ich ein Programm schreiben das unter anderem diese Dinge für einen zentral erledigt und welches jeder nur zu installieren braucht um diese Funktionen nutzen zu können. Ich kann ja schlecht anstatt einer History-Funktion eine Anleitung zum installieren eines Proxy-Dienstes auf einem Server implementieren :wink:

So schwierig kann es doch eigentlich nicht sein der von toms geposteten Prozedur ein paar Schnippsel Code hinzuzufügen, die dafür sorgen dass nach dem Auslesen der URL des ersten Browsers zum nächsten übergegangen werden soll :(

mimi 11. Sep 2005 11:36

Re: URLs aus Firefox-Instanzen auslesen
 
@toms
ich habe die proc nicht getestet aber ich hätte eine frage, weil ich das gleiche problem habe und zwar:

geht das nur wenn ich meine eigne anwendung schreibe oder z.b. ich habe jetzt ein FireFox offen mit unterschiedlichen seiten und möchte gerne herrausfinden welchen link unter der Maus ist(statusbar)?

mdx 24. Apr 2009 22:47

Re: URLs aus Firefox-Instanzen auslesen
 
Kann mir jmd. Helfen, bei mir funktioniert das irgendwie nicht, es kommt immer "E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen"???

jaenicke 24. Apr 2009 23:38

Re: URLs aus Firefox-Instanzen auslesen
 
An welcher Stelle denn?

// EDIT:
Bei mir funktioniert es mit Delphi 2007. :gruebel:

mdx 25. Apr 2009 00:25

Re: URLs aus Firefox-Instanzen auslesen
 
Wie rufst du den das auf?

jaenicke 25. Apr 2009 00:31

Re: URLs aus Firefox-Instanzen auslesen
 
Delphi-Quellcode:
var
  MyUrl, MyTitle: String;
begin
  GetCurrentURL(MyUrl, MyTitle);
  ShowMessage(MyUrl + #13#10 + MyTitle);
Wie sonst? :stupid:

mdx 25. Apr 2009 00:45

Re: URLs aus Firefox-Instanzen auslesen
 
Okay, jetzt gehts zumindest soweit, aber jtezt kommt:

---------------------------
Project1
---------------------------
Assertion fehlgeschlagen (C:\***.pas, Zeile 45)
---------------------------
OK
---------------------------


Zeile 43-47:
Delphi-Quellcode:
if Assigned(p) then try
q := pchar(p);
--> Assert(q^ = '"');
SetLength(URL, StrLen(q));
Inc(q);

jaenicke 25. Apr 2009 00:56

Re: URLs aus Firefox-Instanzen auslesen
 
Unter Delphi 2007 wie in deinem Profil steht? bei Delphi 2009 würde ich das eher vermuten, weil ein String dort ja ein UnicodeString und kein AnsiString mehr ist.
Bei mir funktioniert es jedenfalls mit Delphi 2007 problemlos.

mdx 25. Apr 2009 08:01

Re: URLs aus Firefox-Instanzen auslesen
 
Achso, nein ich habe D2009 und habe schon etwas mit PChar und PAnsiChar korrigiert....

Kannst du mir den Code wenn geht so schreiben dass er auch unter D 2009 funktioniert, währe echt cool!

THX

jaenicke 25. Apr 2009 08:13

Re: URLs aus Firefox-Instanzen auslesen
 
Hast du auch String in AnsiString geändert? Denn sonst hast du weiter hinten vermutlich Probleme mit dem zeichenweisen Zugriff. Also so sollte es eigentlich gehen würde ich sagen:
Delphi-Quellcode:
procedure GetCurrentURL(out URL, Title: AnsiString);
var
   DDEClient : TDDEClientConv;
   p, q: PAnsiChar;
   i: Integer;
begin
...

var
  MyUrl, MyTitle: AnsiString;
begin
...

mdx 25. Apr 2009 08:22

Re: URLs aus Firefox-Instanzen auslesen
 
Na toll, jetzt kommt wieder:
[DCC Fehler] E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen

Also, mein "kompletter" Code (Mal alles so wie du gemacht - Nur Test!)

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ddeman;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

procedure GetCurrentURL(out URL, Title: AnsiString);
var
   DDEClient : TDDEClientConv;
   p, q: PAnsiChar;
   i: Integer;
begin
   DDEClient := TDDEClientConv.Create(nil);
   try
     with DDEClient do if SetLink('IExplore', 'WWW_GetWindowInfo') or
       SetLink('Netscape', 'WWW_GetWindowInfo') or
       SetLink('Mosaic', 'WWW_GetWindowInfo') or
       SetLink('Netscp6', 'WWW_GetWindowInfo') or
       SetLink('Mozilla', 'WWW_GetWindowInfo') or
       SetLink('Firefox', 'WWW_GetWindowInfo') then
       p := RequestData('0xFFFFFFFF')
     else raise Exception.Create('Could not establish browser DDE link');
     if Assigned(p) then try
       q := p;
       Assert(q^ = '"');
       SetLength(URL, StrLen(q));
       Inc(q);
       i := 0;
       while q^ <> '"' do begin
         if (q^ = '\') and (q[1] = '"') then Inc(q);
         Inc(i);
         URL[i] := q^;
         Inc(q);
       end;
       SetLength(URL, i);
       SetLength(Title, StrLen(q));
       i := 0;
       Inc(q, 3);
       while q^ <> '"' do begin
         if (q^ = '\') and (q[1] = '"') then Inc(q);
         Inc(i);
         Title[i] := q^;
         Inc(q);
       end;
       SetLength(Title, i);
     finally
       StrDispose(p);
     end else raise Exception.Create('Could not fetch browser data');
   finally
     DDEClient.Free;
   end;
end;
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 url, title: String;
begin
  HIER KOMMT DER FEHLER--> GetCurrentURL(url, title);
  ShowMessage(url + #13#10 + title);
end;

end.

jaenicke 25. Apr 2009 08:25

Re: URLs aus Firefox-Instanzen auslesen
 
Zitat:

Zitat von jaenicke
Delphi-Quellcode:
var
  MyUrl, MyTitle: AnsiString;

Zitat:

Zitat von mdx
Delphi-Quellcode:
var
 url, title: String;

Fällt dir etwas auf? :cyclops:
Der Parameter der Prozedur ist nun einmal ein AnsiString jetzt, und als var-Parameter muss dieser Typ exakt übereinstimmen.

mdx 25. Apr 2009 08:32

Re: URLs aus Firefox-Instanzen auslesen
 
Was man alles übersehen kann =)
Danke @ jaenicke

Also, richtig muss da natürlich sein: AnsiString!


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

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