Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Link mit ShellExecute aufrufen (https://www.delphipraxis.net/147096-link-mit-shellexecute-aufrufen.html)

wp_xxyyzz 1. Feb 2010 20:15


Link mit ShellExecute aufrufen
 
Ich möchte mit D7 auf Win2k folgendermaßen per ShellExecute eine Internetseite aufrufen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  fn : string;
begin
  fn := 'http://www.delphipraxis.net/';
  ShellExecute(Handle, 'open', PChar(fn), '', '', SW_NORMAL);
end;
Beim Starten meldet sich, verständlicherweise, die Firewall, dass mein Programm ins Internet möchte. Wenn ich mich verklicke und dies verbiete, läuft mein Programm auf den ersten Blick normal weiter, ich kann es aber nicht mehr schließen. Wie kann man das verhindern?

[edit=SirThornberry]Code-Tags durch Delphi-Tags ersetzt - Mfg, SirThornberry[/edit]

Bernhard Geyer 1. Feb 2010 20:22

Re: Link mit ShellExecute aufrufen
 
Gib mal 0 als ersten Parameter an.

wp_xxyyzz 1. Feb 2010 20:59

Re: Link mit ShellExecute aufrufen
 
Hilft nichts...

wp_xxyyzz 1. Feb 2010 21:42

Re: Link mit ShellExecute aufrufen
 
Ich habe meinen Code folgendermaßen erweitert:

Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  fn : string;
  res : integer;
begin
  fn := 'http://www.delphipraxis.net/';
  res := ShellExecute(0, 'open', PChar(fn), '', '', SW_NORMAL);
  ShowMessage(Format('ShellExecute = %d', [res]));
end;
Wenn ich der Firewall den Internet-Zugang erlaube, erscheint nach dem ShellExecute wie erwartet eine Meldung. Wenn ich den Internet-Zugang aber verbiete, hängt die Routine im ShellExecute-Aufruf, die Meldung erscheint gar nicht. Das Programm kann aber im wesentlichen noch bedient werden (bis auf das Schließen und Navigation per Tab). Offenbar kriegt ShellExecute davon nichts mit, dass der Internet-Zugang nicht möglich ist, und versucht weiterhin, ins Netz zu kommen.

Bernhard Geyer 1. Feb 2010 21:45

Re: Link mit ShellExecute aufrufen
 
Welche Firewall hast du denn? Es gibt da ein paar absolute Schrottige die an allen möglichen Ecken und Ende mehr Fehler aus Features aufweisen.

wp_xxyyzz 1. Feb 2010 21:57

Re: Link mit ShellExecute aufrufen
 
Zone Alarm

-Phantom- 1. Feb 2010 23:37

Re: Link mit ShellExecute aufrufen
 
Guck doch mal ob es läuft wenn du die Firewall aus hast?

Hier hab ich auch noch ein Beispiel zum aufrufen von Internetseite mit Shellexecute ;D
Delphi-Quellcode:

uses shellapi;

Var
denkdirwasaus: String;
begin
denkdirwasaus := 'www.google.de';
shellExecute(0,
        Nil,
        PChar(denkdirwasaus),
        Pchar('-Parameter'),
        Pchar('C:\StartDir'),
        SW_NORMAL);
end;
__________________________________________________ __________

Gruß Mathias

wp_xxyyzz 2. Feb 2010 08:09

Re: Link mit ShellExecute aufrufen
 
Wenn die Firewall aus ist, dann kann ich auch nicht dem Programm den Internet-Zugang verweigern, und das Problem kann dann natürlich nicht auftreten.

Bernhard Geyer 2. Feb 2010 08:12

Re: Link mit ShellExecute aufrufen
 
Zitat:

Zitat von wp_xxyyzz
Zone Alarm

Besorg dir eine vernünftige Firewall wie z.B. Sunbelt Personal Firewall. ZoneAlarm ist Schrott.

wp_xxyyzz 2. Feb 2010 19:25

Re: Link mit ShellExecute aufrufen
 
Ich habe nun eine Lösung gefunden: Man muss die Anwendung, die die URL öffnen soll, explizit im ShellExecute-Aufruf eintragen. Da die Firewall diese Anwendung in der Regel ja kennt, wird überhaupt nicht danach gefragt, ob der Netzzugriff erlaubt werden soll oder nicht.

Delphi-Quellcode:
uses
  ShellApi;

procedure TForm1.Button1Click(Sender: TObject);
var
  fn, browser : string;
begin
  fn := 'http://www.delphipraxis.net/';
  browser := GetDefaultBrowser; // siehe unten!
  ShellExecute(0, 'open', PChar(browser), PChar(fn), '', SW_NORMAL);
end;
Um den Default-Browser zu suchen, verwende ich eine Routine nach http://edn.embarcadero.com/article/26083:

Delphi-Quellcode:
function GetDefaultBrowser: string;
var
  tmp: PChar;
  res: LPTSTR;
begin
  result := '';
  tmp := StrAlloc(255);
  res := StrAlloc(255);
  try
    GetTempPath(255, tmp);
    if FileCreate(tmp + 'htmpl.htm') <> -1 then
    begin
      if FindExecutable('htmpl.htm', tmp, res) > 32 then
        result := res;
      SysUtils.DeleteFile(tmp + 'htmpl.htm');
    end;
  finally
    StrDispose(tmp);
    StrDispose(res);
  end;
end;
Etwas stört mich, dass die Temporärdatei "htmpl.htm" nach dem Beenden des Programms noch vorhanden ist. Diese Datei wurde erzeugt, da die Windows-Funktion FindExecutable eine existierende Datei benötigt, um das mit der Endung .htm verknüpfte Programm zu finden. Warum wird diese Datei nicht gelöscht, obwohl DeleteFile aufgerufen wird?

Oder statt einer Hilfsdatei: Gibt es eine HTML-Datei, die in jedem Windowssystem vorkommt, um sie für FindExecutable verwenden zu können?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:33 Uhr.
Seite 1 von 2  1 2      

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