![]() |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:27 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 by Thomas Breitkreuz