![]() |
SHGetFileInfo und Dateien in der Path-Umgebungsvariable
Ich verwende folgenden Code um das Icon von Dateien zu ermitteln. Wenn ich den kompletten Pfad zur Anwendung kenne ist es ja auch kein Problem, auch wenn ich bspw. nur '.zip' angebe wird mir das Icon korrekt angezeigt.
Will ich jetzt aber das Icon einer Datei (z.B. taskmgr.exe) ermitteln, schlägt das fehl und ich bekomme nur das Standardicon für Anwendungen angezeigt. Meine Frage ist nun wie ich SHGetFileInfo dazu überreden kann auch die Path-Umgebungsvariable zu durchsuchen/verwenden? :gruebel:
Delphi-Quellcode:
function GetIconFromFile(const szFilename: string;
fSmall: boolean = false): TIcon; const dwIconFlags : array[boolean]of dword = (SHGFI_LARGEICON,SHGFI_SMALLICON); var fi : TSHFileInfo; begin Result := nil; ZeroMemory(@fi,sizeof(fi)); SHGetFileInfo(pchar(szFilename),FILE_ATTRIBUTE_NORMAL, fi, sizeof(fi), SHGFI_ICON or SHGFI_USEFILEATTRIBUTES or dwIconFlags[fSmall]); if(fi.hIcon <> 0) then begin Result := TIcon.Create; if(Result <> nil) then Result.Handle := fi.hIcon; end; end; |
Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable
Das wirst du wohl selber machen müssen.
|
Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable
Wenn ich wüsste wie das geht, würde ich nicht fragen. Den anderen Code habe ich ja auch hier aus dem Forum... :oops:
|
Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable
![]() |
Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable
Ähem, wenn er weiß, dass das Programm im Pfad ist, dann kann er auch eine Funktion von Borland zweckentfremden. Jetzt müsste mir nur der Name einfallen ... :oops: Der übergibt man die Pfadvariablen und den Dateinamen, und die Funktion macht nichts weiter als jeweils einen Pfad nach dem anderen vor den Dateinamen zu setzen und via "fileexists" nach der Datei zu suchen.
Weiß irgendwer gerade den Namen? :( Hm, das soll mich doch ... Edit: ![]() |
Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable
Danke für den Tip Mathias!
Hier nun die überarbeitete Funktion:
Delphi-Quellcode:
Die Funktion verschluckt sich noch bei Pfaden die Punkte enthalten. Wird die Zeile
function GetIconFromFile(szFilename: string;
fSmall: boolean = false): TIcon; const dwIconFlags : array[boolean]of dword = (SHGFI_LARGEICON,SHGFI_SMALLICON); var fi : TSHFileInfo; aPath : String; begin Result := nil; ZeroMemory(@fi,sizeof(fi)); szFileName := Copy(szFileName, 0, LastDelimiter('.', szFileName) + 3); if ExtractFilePath (szFileName) <> '' then begin aPath := szFileName; end else begin aPath := FileSearch(szFileName, GetEnvironmentVariable('Path')); if ExtractFilePath (aPath) = '' then aPath := szFileName ; end; SHGetFileInfo(pchar(aPath),FILE_ATTRIBUTE_NORMAL, fi, sizeof(fi), SHGFI_ICON or SHGFI_USEFILEATTRIBUTES or dwIconFlags[fSmall]); if(fi.hIcon <> 0) then begin Result := TIcon.Create; if(Result <> nil) then Result.Handle := fi.hIcon; end; end;
Delphi-Quellcode:
weggelassen funktioniert das zwar auch, allerdings gibt es dann Probleme wenn der Pfad noch irgendwelche Parameter (z.B. notepad.exe c:\temp\irgendwas.txt) enthält. :pale:
szFileName := Copy(szFileName, 0, Pos('.', szFileName) + 3);
Wenn jemand dafür noch eine Lösung hätte wäre ich dankbar dafür. :-D [EDIT]Achso, ParamStr / ParamCount funktionieren hier nicht, weil der Pfad nicht über die Kommandozeile übergeben wird. [EDIT 2]
Code:
durch
szFileName := Copy(szFileName, 0, Pos('.', szFileName) + 3);
Code:
ersetzt.
szFileName := Copy(szFileName, 0, LastDelimiter('.', szFileName) + 3);
|
Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable
Moin Ringli,
Zitat:
Schau Dir in der Hilfe mal die Funktion ![]() Wenn die Pfade auch noch Parameter enthalten können, wird es allerdings noch schwieriger. Woher stammen die Pfade denn? |
Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable
Zitat:
Das funktioniert auch alles sehr gut. Wenn ich bspw. "%SystemRoot%\system32\secpol.msc /s" als Befehlszeile dort eintrage, ergänzt die RunAs-Funktion beim Ausführen den Pfad so das er dann so aussieht:
Code:
Jetzt wollte ich aber halt noch als optische Verbesserung in der Oberfläche vor den Einträgen in der TreeView das dazugehörige Programmicon anzeigen.
"C:\Windows\system32\mmc.exe %SystemRoot%\system32\secpol.msc /s".
Allerdings wollte ich dazu nicht alles in meinem Programm umstricken, da ich sonst den Pfad und die Parameter trennen müsste. Ich hoffe die Beschreibung war einigermassen verständlich? :gruebel: Zitat:
|
Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable
Moin Ringli,
wenn sichergestellt ist, dass die Parameter immer mit Blank vom Pfad getrennt sind kannst Du es doch so machen:
Delphi-Quellcode:
sPath := trim(copy(sPathInclPara,1,LastDelimiter(' ',sPathInclPara)));
sExt := ExtractFileExt(sPath); |
DP-Maintenance
Dieses Thema wurde von "Christian Seehase" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Kein allgemeines Problem |
Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable
Danke für deinen Vorschlag Christian! :-D
Ich hab jetzt mal den ganzen Nachmittag rumprobiert, aber leider versagt dein Code bei Verzeichnisnamen mit Leerzeichen und bei mehr als einem Parameter. Ich habe meinen geposteten Code jetzt soweit abgeändert das ich Pos durch LastDelimiter ersetzt habe. Diese Vorgehensweise erzeugt meines Erachtens nach im praktischen Einsatz die wenigsten Probleme. |
Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable
Moin Ringli,
etwas aufwendiger zu parsen, aber dann auch "parameterfest" lässt sich das darstellen, wenn Du vor dem Speichern feststellst, ob der Pfad Leerzeichen enthält, und dann den Pfad in " einschliesst. Jetzt kannst Du prüfen: Erstes Zeichen "? Dann ist bis zum nächsten " der Pfad Kein "? Leerzeichen (oder sonstiges Parametertrennzeichen) enthalten? Dann geht der Pfad bis zum Leerzeichen Kein Leerzeichen? ==> Nur ein Pfad. (Blöd, dass ich nur an einen Parameter gedacht habe :wall: ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:42 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