Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Problem beim Auslesen von .lnk-Dateien (https://www.delphipraxis.net/156086-problem-beim-auslesen-von-lnk-dateien.html)

Edlmann 19. Nov 2010 11:46

Problem beim Auslesen von .lnk-Dateien
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Nachmittag liebe DP, ich versuche zurzeit, mir meine eigene Schnellstartleiste
zu erstellen, und hierfür muss ich die Icons von .lnk Dateien auslesen.
Hierzu benutze ich eine Funktion, die ich hier
http://www.delphipraxis.net/55412-ic...b-*-lnk-3.html
geschrieben von Martin K gefunden habe, doch ich habe auch schon verschieden andere ausprobiert.
Bei allen habe ich dasselbe Problem: Das Icon des Programms wird erfolgreich ausgelesen, jedoch von
dem Standardmäßigem "Dateityp nicht zugeordnet-Icon" überlagert wird. Anbei ein Screenshot, der deutlich macht
was ich meine. Nun wollt ich fragen ob einer von euch eine Lösung dazu weiß.
Danke im Vorraus,
Edlmann

Hier nochmal die Funktion:

Delphi-Quellcode:
function FileIcon(FileName: String): TIcon;
var FileInfo: TSHFileInfo; AIcon: TIcon;
begin
  FillChar(FileInfo,SizeOf(FileInfo),#0);
  SHGetFileInfo(PChar(FileName),0,FileInfo,SizeOf(FileInfo),SHGFI_ICON or SHGFI_LARGEICON);
  AIcon:=TIcon.Create;
  Try
    AIcon.Handle:=FileInfo.HIcon;
    AIcon.Transparent:=True;
  Except end;
  Result:=AIcon;
end;

DeddyH 19. Nov 2010 11:52

AW: Problem beim Auslesen von .lnk-Dateien
 
Bist Du sicher, dass das an der Funktion liegt? Oder lädst Du die Dinger evtl. in Images, in denen bereits das "Nicht zugeordnet"-Icon geladen wurde?

Edlmann 19. Nov 2010 11:59

AW: Problem beim Auslesen von .lnk-Dateien
 
Aufrufen tue ich die Funktion wie folgt:

Delphi-Quellcode:
for x := 0 to 7 do
  for y := 0 to 7 do
    if x*y <= ListBox1.Items.Count then
      Image1.Canvas.Draw(x*34, y*34, FileIcon(ListBox1.Items.Strings[x*y]));
(Die .lnk Pfade stehen in der ListBox1)

Und bei normalen Dateitypen funktioniert die Funktion auch astrein, nur bei .lnk Dateien passiert dies.

himitsu 19. Nov 2010 12:04

AW: Problem beim Auslesen von .lnk-Dateien
 
Erstmal was zur Speicherverwaltung:
(abgesehn davon, daß es eher unklug ist, ein Objekt so zurückzugeben, da man das Prinzip "der Verursacher/Ersteller gibt's auf gleicher Ebene wieder frei" nicht einhalten kann)
Bei einer Exception würde das Object in AIcon als Speicherleck zurückbleiben.
Delphi-Quellcode:
AIcon := TIcon.Create;
try
  AIcon.Handle := FileInfo.HIcon;
  AIcon.Transparent := True;
except
  AIcon.Free; // bei Fehler freigeben
end;
Result := AIcon;
Delphi-Quellcode:
function FileIcon(FileName: String): TIcon;
var FileInfo: TSHFileInfo;
begin
  FillChar(FileInfo, SizeOf(FileInfo), #0);
  if SHGetFileInfo(PChar(FileName), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON) <> 0 then
    RaiseLastOSError;
  Result := TIcon.Create;
  try
    Result.Handle := FileInfo.HIcon;
    Result.Transparent := True;
  except
    Result.Free;
  end;
end;
(SHGFI_LARGEICON könnte man auch weglassen ... das ist eh 0)

So, zum Problem.
Hmmm, notfalls wirst du wohl in die LNK-Dateien reinsehn müssen.
(irgendwo gab's in der DP auch 'nen Code zum Auslesen)
Da schauen ob ein Icon zugeordnet ist.
- wenn ja, dann dieses nehmen
- wenn nein, dann über deine Funktion das Icon der Zieldatei besorgen

DeddyH 19. Nov 2010 12:24

AW: Problem beim Auslesen von .lnk-Dateien
 
Der erste Punkt lag mir auch schon auf der Seele. Ich persönlich würde aus der Funktion ja eine Prozedur machen, die das zu befüllende Icon entgegennimmt.
Delphi-Quellcode:
procedure GetFileIcon(const FileName: String; aIcon: TIcon);
var FileInfo: TSHFileInfo;
begin
  Assert(Assigned(aIcon));
  FillChar(FileInfo, SizeOf(FileInfo), #0);
  if SHGetFileInfo(PChar(FileName), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON) <> 0 then
    RaiseLastOSError;
  aIcon.Handle := FileInfo.HIcon;
  aIcon.Transparent := True;
end;

Edlmann 19. Nov 2010 12:34

AW: Problem beim Auslesen von .lnk-Dateien
 
Okey, dann ist es jetzt wenigstens stilistisch korrekt :P

Aber zurück zu meinem Problem. Im Forum steht, dass die Prozedur funktioniert und
auch korrekte Ergebnisse liefert. Kann es daran liegen dass ich Windows 7 (64-bit)
benutze? Vielleicht werden die .lnk Dateien da ja anders verarbeitet?

Eine Prozedur zum Nachverfolgen der Icons habe ich hier auch schon gefunden, diese sind
jedoch ungleich komplizierter, und von daher wollt ich erstmal nachfragen ob es nicht
auch auf einfache weise geht :P

Danke schonmal,
Edlmann


Alle Zeitangaben in WEZ +1. Es ist jetzt 15: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