Pobieranie ikonki

0

Jak pobrać ikonkę danego rozszerzenia nie podając pliku?

Ja robię tak:
var
Ico : PShFileInfo;
begin
GetMem( Ico, sizeof(TShFileInfo) );
try
shGetFileInfo( PChar('Plik.sys'), 0, Ico^, sizeof(TShFileInfo), shgfi_sysiconindex or shgfi_icon or

shgfi_smallicon);
Image1.Picture.Icon.Handle:=Ico.hIcon;
finally
FreeMem(ico);
end;

Ale wada w tym że ma rozpoznawać ikonkę po rozszerzeniu a nie po pliku.
Kompinować z rejestrem mi się nie chce (np. HKEY_CLASSES_ROOT\exefile\DefaultIcon).
Można też tymczasowo utworzyć plik i użyć powyższej funkcji,ale to bez sensu.

Zna może ktoś lepszy i prostszy sposób?

0

Jak to już ktoś mądry kiedyś napisał :

function GetAssociatedIcon(const AExtension: string; ASmall: Boolean): HIcon;
var
   Info: TSHFileInfo;
   Flags: Cardinal;
begin
   if ASmall then
      Flags := SHGFI_ICON or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES or SHGFI_SYSICONINDEX
   else
      Flags := SHGFI_ICON or SHGFI_LARGEICON or SHGFI_USEFILEATTRIBUTES;

   SHGetFileInfo(PChar(AExtension), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo), Flags);
   Result := Info.hIcon;
end;

Zwraca, jak widać, chwyt do ikonki. Można to wykorzystać tak:

Ikona := TIcon.Create;
Ikona.Handle := GetAssociatedIcon(ExtractFileExt(OpenDialog1.FileName), True);
ImageList1.AddIcon(Ikona);

1 użytkowników online, w tym zalogowanych: 0, gości: 1