Entwickler-Ecke

Dateizugriff - Symbol von Verknüpfung aus Registry lesen


Harry M. - Mo 29.08.05 10:28
Titel: Symbol von Verknüpfung aus Registry lesen
Wie genau kann ich aus HKEY_CLASSES_ROOT den Phat zur Exe finden mit dem der Dateityp verknüpft ist. So möchte ich erreichen das mir in einem Image das Icon angezeigt wird wenn ich die Extesion angebe.
In HKEY_CLASSES_ROOT steht irgendwie soviel :oops: Wie ich das Symbol der Exe bekomme und aus der Registry lese weiß ich.


LigH - Mo 29.08.05 17:18

Normalerweise fängt man bei der Dateiendung an - in diesem Zweig ist zwar meist nicht schon das Icon zu finden, dafür aber die Klasse, in der das Icon steht.

Konkretes Beispiel:

Icon für *.pas-Dateien:

1) HKCR\.pas\ => BDS.PasFile (von der Dateiendung zur allgemeinen Klasse)
2) HKCR\BDS.PasFile\DefaultIcon\ => "E:\Programme\Borland\BDS\3.0\Bin\delphicoreide90.bpl",4


bl@ckcomb - Mo 29.08.05 17:31

Wenn du das Dateisymbol von bestimmten Dateien auslesen willst, geht das mit folgender Methode am schnellsten:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
// uses ShellApi
var
  FileInfo: SHFileInfo;
begin
  SHGetFileInfo(PChar({Dateiname}), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON);
  // dann z.B.:
  Image1.Picture.Icon.Handle := FileInfo.hIcon;
end;


Ansonsten kannst du mit dieser Funktion das Symbol auslesen, wenn nur die Dateinamenserweiterung bekannt ist:

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:
// uses Registry
function GetIconFromExt(const Ext: String; SmallIcon: Boolean): hIcon; // Dateinamenserweiterung mit "." am Anfang!
var
  Reg: TRegistry;
  s: String;
  sl: TStrings;
  i, c: Integer;
  icon_large, icon_small: hIcon;
begin
  Result := 0;
  Reg := TRegistry.Create(KEY_READ);
  Reg.RootKey := HKEY_CLASSES_ROOT;
  If Reg.OpenKey(Ext, False) Then
  begin
    s := Reg.ReadString('');
    Reg.CloseKey;
    If (s <> ''and Reg.OpenKey(s+'\DefaultIcon', False) Then
    begin
      sl := TStringList.Create;
      sl.CommaText := Reg.ReadString('');
      If sl.Count > 0 Then
      begin
        If sl.Count > 1 Then
        begin
          Val(sl[1], i, c);
          If c <> 0 Then
            i := 1;
        end
        else
          i := 1;
        ExtractIconEx(PChar(sl[0]), i, icon_large, icon_small, 1);
        If SmallIcon Then
        begin
          DestroyIcon(icon_large);
          Result := icon_small;
        end
        else
        begin
          DestroyIcon(icon_small);
          Result := icon_large;
        end;
      end;
      sl.Free;
    end;
  end;
  Reg.Free;
end;

Beispiel:

Delphi-Quelltext
1:
Image1.Picture.Icon.Handle := GetIconFromExt('.txt', False);                    


Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt.


Harry M. - Mo 29.08.05 17:38

Jo. Thx. Ich gucke mir das heute abend an.


Delete - Mo 29.08.05 20:13

Das Symbol von bekannten Dateiendungen lässt sich auch mit SHGetFileInfo ermitteln. Als Attribut wird einfach FILE_ATTRIBUTE_NORMAL benutzt:

Delphi-Quelltext
1:
SHGetFileInfo('.txt',FILE_ATTRIBUTE_NORMAL,...);                    

usw.


bl@ckcomb - Di 30.08.05 12:24

user profile iconMathiasSimmack hat folgendes geschrieben:
Das Symbol von bekannten Dateiendungen lässt sich auch mit SHGetFileInfo ermitteln. Als Attribut wird einfach FILE_ATTRIBUTE_NORMAL benutzt:

Delphi-Quelltext
1:
SHGetFileInfo('.txt',FILE_ATTRIBUTE_NORMAL,...);                    

usw.

Stimmt, ist mir auch neu :wink:
Kleine Ergänzung:

Quelltext
1:
SHGetFileInfo('.txt', FILE_ATTRIBUTE_NORMAL, FileInfo, SizeOf(FileInfo), SHGFI_ICON or SHGFI_USEFILEATTRIBUTES);