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?