Entwickler-Ecke

Windows API - Welcher Standardbrowser ist installiert ?


Hochhaus - Mo 06.01.14 00:48
Titel: Welcher Standardbrowser ist installiert ?
Hallo allerseits !

wie findet man mit Delphi heraus, welches der Standardbrowser ist, der auf dem System installiert wurde - und welche Version es ist ? Ich finde nur Code, der sich auf den Internet-Explorer bezieht (mit Google).

Danke im Voraus für jede Antwort !


Hochhaus


Delete - Mo 06.01.14 10:26

http://edn.embarcadero.com/article/26083

Sourcecode etwas geändert...

Ergebnis:
Name: firefox.exe
Path: C:\Program Files (x86)\Mozilla Firefox\
Version: 25.0.1 Build 5064



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
uses ...ShellApi,...

Procedure MM(s: String);
begin
 Form1.Memo1.lines.add(s);
end;

function FileVersion(const FileName: TFileName): String;
var
  VerInfoSize: Cardinal;
  VerValueSize: Cardinal;
  Dummy: Cardinal;
  PVerInfo: Pointer;
  PVerValue: PVSFixedFileInfo;
  iLastError: DWord;
begin
  Result := '';
  VerInfoSize := GetFileVersionInfoSize(PChar(FileName), Dummy);
  if VerInfoSize > 0 then
  begin
    GetMem(PVerInfo, VerInfoSize);
    try
      if GetFileVersionInfo(PChar(FileName), 0, VerInfoSize, PVerInfo) then
      begin
        if VerQueryValue(PVerInfo, '\', Pointer(PVerValue), VerValueSize) then
          with PVerValue^ do
            Result := Format('%d.%d.%d Build %d', [
              HiWord(dwFileVersionMS), //Major
              LoWord(dwFileVersionMS), //Minor
              HiWord(dwFileVersionLS), //Release
              LoWord(dwFileVersionLS)]); //Build
      end
      else
      begin
        iLastError := GetLastError;
        Result := Format('GetFileVersionInfo failed: (%d) %s',
                      [iLastError, SysErrorMessage(iLastError)]);
      end;
    finally
      FreeMem(PVerInfo, VerInfoSize);
    end;
  end
  else
  begin
    iLastError := GetLastError;
    Result := Format('GetFileVersionInfo failed: (%d) %s',
                     [iLastError, SysErrorMessage(iLastError)]);
  end;
end;

type
  TBrowserInformation = record
    Name: string;
    Path: string;
    Version: string;
  end;

function GetDefaultBrowser2 : TBrowserInformation;
var
  tmp : PChar;
  res : PChar;
  version : String;

begin
  tmp := StrAlloc(255);
  res := StrAlloc(255);

  try
    GetTempPath(255,tmp);
    FileCreate(tmp+'htmpl.htm');
    FindExecutable('htmpl.htm',tmp,Res);
    Result.Name := ExtractFileName(res);
    Result.Path := ExtractFilePath(res);
    Result.Version := FileVersion(res);
    SysUtils.DeleteFile(tmp+'htmpl.htm');
  finally
    StrDispose(tmp);
    StrDispose(res);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MM('Name: '+GetDefaultBrowser2.Name);
MM('Path: '+GetDefaultBrowser2.Path);
MM('Version: '+GetDefaultBrowser2.Version);
end;


Hochhaus - Mo 06.01.14 17:08

Danke ! Super ! Es funktioniert.


Hochhaus


jaenicke - Mo 06.01.14 17:54

Wobei es eigentlich so nicht korrekt ist. Denn das ist nicht der Standardbrowser, sondern der Browser, mit dem .htm Dateien standardmäßig geöffnet werden.

Korrekterweise müsste man den Browser ermitteln, der mit dem HTTP-Protokoll verknüpft ist, wie es auch Windows selbst macht.

Außerdem überkommt mich das blanke Grausen, wenn ich sehe, dass da extra eine temporäre Datei erstellt wird, nur weil es der Autor des Artikels nicht besser konnte... :shock:


Delete - Mo 06.01.14 18:03

@jaenicke: Irrtum!

Der Browser, der zum Öffnen von HTML-Files genutzt wird, wird so gefunden:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
uses Registry...

procedure TForm1.Button13Click(Sender: TObject);
var
  Reg: TRegistry;
  KeyName: string;
  ValueStr: string;
begin
  Reg := TRegistry.Create(KEY_READ);
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    KeyName     := 'htmlfile\shell\open\command';
    if Reg.OpenKey(KeyName, False) then
    begin
      ValueStr := Reg.ReadString('');
      Reg.CloseKey;
      ShowMessage(ValueStr);
    end
    else
      ShowMessage('There isn''t a default browser');
  finally
    Reg.Free;
  end;
end;


jaenicke - Mo 06.01.14 21:18

Du kannst aber auch problemlos einen Browser als Standardbrowser nehmen und einen anderen mit htm-Dateien und noch einen anderen mit html-Dateien verknüpfen... :!:

Das ganze Gedöns mit den Dateierweiterungen hat rein und absolut überhaupt nichts mit dem Standardbrowser zu tun. Er ist nur meistens der gleiche... aber das ist nicht so festgelegt, sondern einfach nur meistens so eingestellt...


Gerd Kayser - Do 09.01.14 09:02

Der Standardbrowser ist in der Registry unter \Software\Clients\StartMenuInternet aufgeführt. Ausgewertet wird zuerst der Eintrag unter HKey_Current_User und danach erst ggf. unter HKey_Local_Machine.

Quelle: http://msdn.microsoft.com/en-us/library/windows/desktop/dd203067(v=vs.85).aspx


Delete - Do 09.01.14 11:04

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet]
@="IEXPLORE.EXE"


[HKEY_CURRENT_USER\Software\Clients\StartMenuInternet]
@="FIREFOX.EXE"


Gerd Kayser - Do 09.01.14 18:14

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
@="IEXPLORE.EXE"

@="FIREFOX.EXE"


Das ist kein Widerspruch zu meiner Aussage. Firefox ist hier der Standardbrowser. Erst wenn der Eintrag unter HKey_Current_User fehlt oder leer ist, wird der Schlüssel unter HKey_Local_Machine genommen.