czesc
szukalem i nie znalazlem.
jak pobrac ikone skrotu ale bez tej cholernej strzaleczki w lewym dolnym rogu ikony?
pozdr
czesc
szukalem i nie znalazlem.
jak pobrac ikone skrotu ale bez tej cholernej strzaleczki w lewym dolnym rogu ikony?
pozdr
Chyba trzeba pobrać ścieżkę do pliku do którego odwołuje się skrót i z tego pliku pobrać ikonę ?
Z tego pliku system pobiera ikonę i dokleja do niej strzałkę.
mądry inaczej napisał(a)
Chyba trzeba pobrać ścieżkę do pliku do którego odwołuje się skrót i z tego pliku pobrać ikonę ?
Z tego pliku system pobiera ikonę i dokleja do niej strzałkę.
i tak i nie... bo ikone skrotu mozna zmienic...
myslalem ze jest jakis systemowy "gotowiec" do tego, no ale coz, jak nie ma to trzeba sie bedzie samemu nad tym pomeczyc... :/
////napisalem cos takiego (na szybko wiec nie czepiac sie kodu ;] ):
function extractIconFromLnk(Plik:WideString):HIcon;
var
MyObj : IUnknown;
MyLnk : IShellLink;
MyPf : IPersistFile;
ok : TWin32FindData;
IconFile : array [0..MAX_PATH] of char;
LinkedFile : array [0..MAX_PATH] of char;
index:integer;
index2:word;
h:HIcon;
hLarge:HIcon;
info:_SHFILEINFO;
begin
MyObj := CreateComObject(CLSID_ShellLink);
MyLnk := MyObj as IShellLink;
MyPf := MyObj as IPersistFile;
MyPf.Load(PWideChar(Plik),fmOpenRead);
MyLnk.GetIconLocation(iconFile, MAX_PATH, index); //wyciagamy sciezke do pliku zawierajacego ikone skrotu oraz jej index
MyLnk.GetPath(linkedFile, MAX_PATH, ok,0);//wyciagamy nazwe pliku na ktory wskazuje skrot
index2:=index;
h:=0;
if fileexists(iconFile) then
begin //wyciagamy ta ikone, na ktora wskazuje skrot
h:=ExtractAssociatedIcon(hInstance,PChar(String(iconfile)), index2) ;
end;
if h<=0 then
begin //wyziagamy ikone z pliku na ktory wskazuje skrot
SHGetFileInfo(PChar(String(linkedFile)), 0, info, SizeOf(TSHFILEINFO), SHGFI_ICON or SHGFI_SMALLICON );
h:=info.hIcon;
end;
if h<=0 then
begin //wyziagamy ikone skrotu
SHGetFileInfo(PChar(plik), 0, info, SizeOf(TSHFILEINFO), SHGFI_ICON or SHGFI_SMALLICON );
h:=info.hIcon;
end;
result:=h;
end;
po 1. niektore ikonki wygladaja naprawde kiepsko (cos jak by przeskalowane).
po 2. jak ta funkcja wezme ikonkie pliku ".bat" to mi zwraca ikone folderu :/
Miałem kiedyś podobne problemy z wyświetlaniem ikon na liście plików (chodziło o zawartość FTP)
Nie wszystkie systemowe ikony dało się prawidłowo wyświetlić lub pobrać, często miałem ikonę folderu zamiast właściwej ikony. Szczególnie pojawiał się błąd jeśli np miałem pokazać ikonę pliku *.doc ale nie systemową tylko taką jaką wyświetla Windows po przypisaniu np do Office - powinna być ikona z literką W, a była systemowa.
Więc zrobiłem to po chłopsku - dla każdego pliku którego ikonę miałem pobrać, tworzyłem w katalogu Temp, pusty plik o takim samym rozszerzeniu, pobierałem z niego obraz ikony i kasowałem :)
A dla plików exe normalnie.
Jeszcze mozna dostac sie do ikonki poprzez interfejs IExtractIcon (bo nie sluzy on tylko aby tworzyc ale tez i pobierac) z interfejsu IShellFolder (a ten startuje z Desktop ...).
dobra, w sumie rozwiazane, choc mam gdzies dziwny blad...:
sprawca zle wyswietlanych niektorych ikonek byl ExtractAssociatedIcon(). Zamienilem na ExtractIconEx i jest ok.
dziwi mnie tylko dlaczego tak sie dzieje:
otoz czasem ta funkcja zwracala mi hicon=0. a tak byc nie powinno, poniewaz skoro plik istnieje, to musi posiadac ikone. a co za tym idzie ten kod:
if h<=0 then
begin //wyziagamy ikone skrotu
SHGetFileInfo(PChar(plik), 0, info, SizeOf(TSHFILEINFO), SHGFI_ICON or SHGFI_SMALLICON );
h:=info.hIcon;
end;
musi nam te ikone zwrocic. nie wiem wiec dlaczego zwraca czasem 0...
ale jezcze bardziej dziwi mnie fakt, ze gdy wycialem ten fragment z funkcji, a dalem go po jej wywolaniu to wszystko dziala idealnie :|
teraz wyglada to mniej wiecej tak:
function extractIconFromLnk(Plik:WideString):HIcon;
var
MyObj : IUnknown;
MyLnk : IShellLink;
MyPf : IPersistFile;
ok : TWin32FindData;
IconFile : array [0..MAX_PATH] of char;
LinkedFile : array [0..MAX_PATH] of char;
index:integer;
index2:word;
h:HIcon;
hLarge:HIcon;
info:_SHFILEINFO;
begin
MyObj := CreateComObject(CLSID_ShellLink);
MyLnk := MyObj as IShellLink;
MyPf := MyObj as IPersistFile;
MyPf.Load(PWideChar(Plik),fmOpenRead);
MyLnk.GetIconLocation(iconFile, MAX_PATH, index);
MyLnk.GetPath(linkedFile, MAX_PATH, ok,0);
index2:=index;
h:=0;
if (lowercase(extractfileext(plik))='.lnk') then
begin
//wyciagamy ikonke, ktora wskazuje nam skrot...
ExtractIconEx(PChar(String(iconfile)), index2, hLarge, h, 1);
if (h<=0) then
begin //wyziagamy ikone z pliku na ktory wskazuje skrot
SHGetFileInfo(PChar(String(linkedFile)), 0, info, SizeOf(TSHFILEINFO), SHGFI_ICON or SHGFI_SMALLICON );
h:=info.hIcon;
end;
end;
{ TO WYCIETE BO CZASEM NIE DZIALALO....:
if h<=0 then
begin //wyziagamy ikone skrotu
SHGetFileInfo(PChar(plik), 0, info, SizeOf(TSHFILEINFO), SHGFI_ICON or SHGFI_SMALLICON );
h:=info.hIcon;
end; }
result:=h;
end;
i w funkcji zwracajacej ikone jako TIcon (potrzebne, bo tu np sprawdzam czy "filename" jest folderem i jesli tak, to zwracam "swoja" ikonke folderu)
[...]
icon:=TIcon.Create;
icon.Handle:=extractIconFromLnk(filename);
if icon.Handle<=0 then //tam nie dzialalo a tu dziala... wtf!?
begin
SHGetFileInfo(PChar(filename), 0, info, SizeOf(TSHFILEINFO), SHGFI_ICON or SHGFI_SMALLICON );
icon.Handle:=info.hIcon;
end;
result:=icon;
end;
ma ktos pomysl czemu ten fragment kodu nie dzialal w mojej funkcji "extractIconFromLnk()" a dziala tutaj? :|
typy ...
Pchar(String(
reichel napisał(a)
typy ...
Pchar(String(
aaaa.... myslalem ze z WideString tez zadziala [glowa]
dzieki (po raz kolejny ;] ) [browar]