Danke für den Tip Mathias!
Hier nun die überarbeitete Funktion:
Delphi-Quellcode:
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;
Die Funktion verschluckt sich noch bei Pfaden die Punkte enthalten. Wird die Zeile
szFileName := Copy(szFileName, 0, Pos('.', szFileName) + 3);
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.
Wenn jemand dafür noch eine Lösung hätte wäre ich dankbar dafür.
[EDIT]Achso, ParamStr / ParamCount funktionieren hier nicht, weil der Pfad nicht über die Kommandozeile übergeben wird.
[EDIT 2]
Code:
szFileName := Copy(szFileName, 0, Pos('.', szFileName) + 3);
durch
Code:
szFileName := Copy(szFileName, 0, LastDelimiter('.', szFileName) + 3);
ersetzt.