![]() |
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 ![]() 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; |
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?
|
AW: Problem beim Auslesen von .lnk-Dateien
Aufrufen tue ich die Funktion wie folgt:
Delphi-Quellcode:
(Die .lnk Pfade stehen in der ListBox1)
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])); Und bei normalen Dateitypen funktioniert die Funktion auch astrein, nur bei .lnk Dateien passiert dies. |
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:
(SHGFI_LARGEICON könnte man auch weglassen ... das ist eh 0)
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; 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 |
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; |
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 14:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz