Problem z ExtractIcon

0

Witam. Mam taki oto problem:
Chcę pobrać ikonę przypisaną do rozszerzenia. Temat był już opisywany, ale mało precyzyjnie Z rejestru zwraca mi taką wartość (szukałem .txt): '%SystemRoot%\Sys32\shell32.dll,-152 Pytanie: jak z tego wyciągnąć ikonę(wystarczy mi uchwyt)? Używam extracticon, ale działa tylko gdy wpiszę całą ścieżkę (nie przyjmuje %SystemRoot%, a poza tym trzeci parametr to numer ikony, a przyjmuje tylko dodatnie:(. Nie przyjmie -152. Próbowałem dać 0 (inne też próbowałem) ale daje inne ikony niż tą z notatnika. Pomóżcie błagam. Może jakaś funkcja co na podstawie czegoś takiego: '%SystemRoot%\Sys32\shell32.dll,-152' i podobnych zwrócił mi ten kochany uchwyt:)

0

oto odpowiedź:
Na formę daj Button i Image a potem napisz taką procedure pod buttonem:

var
SysDir : array[0..255] of char;
ZlaSciezka,DobraSciezka : string;
dlg: integer;
begin
ZlaSciezka := '%SystemRoot%\system32\shell32.dll,-152';
GetSystemDirectory(SysDir,SizeOf(SysDir));
DobraSciezka := StringReplace(ZlaSciezka,'%SystemRoot%\system32',SysDir,[rfReplaceAll]);
DobraSciezka := StringReplace(DobraSciezka,',-','',[rfReplaceAll]);
dlg:= Length(DobraSciezka);
SetLength(DobraSciezka,dlg-3);
Image1.Picture.Icon.Handle := ExtractIcon(HInstance,PChar(DobraSciezka),152);// tutaj jest wpisywany index ikony

No i to wsio nie zapomnij dodać do list modułów ShellApi ;-)
Napisz czy pomogło oczywiscie można pobrać tą scieżkę od razu z rejestru Win'a ale z tym chyba dasz sobie radę.
Pozdro<code class="delphi"></code> [diabel]

0

Oto odp.
Daj na formę Buttona i Image i w Buttona wstaw tę procedure;

procedure TForm1.Button1Click(Sender: TObject);
var
SysDir : array[0..255] of char;
ZlaSciezka,DobraSciezka : string;
dlg: integer;
begin
ZlaSciezka := '%SystemRoot%\system32\shell32.dll,-152';
GetSystemDirectory(SysDir,SizeOf(SysDir));
DobraSciezka := StringReplace(ZlaSciezka,'%SystemRoot%\system32',SysDir,[rfReplaceAll]);
DobraSciezka := StringReplace(DobraSciezka,',-','',[rfReplaceAll]);
dlg:= Length(DobraSciezka);
SetLength(DobraSciezka,dlg-3);
Image1.Picture.Icon.Handle := ExtractIcon(HInstance,PChar(DobraSciezka),Index);
end;

end.

Napisz czy działa ten przykładzik.Może nie jest idealny ale działać powinien.

0

Konwertowanie ścieżki działa idealnie.
Ale skąd mam wziąć index? Ikona pliku TXT ma w tym dll numer 70(sprawdziłem "ręcznie"). A w ścieżce(pobranej z rejestru) uzyskuje -152.

poza tym to konwertowanie ściezki jest tylko dla tego przykładu. Nie zadziała dla innego np gdy poda ścieżkę 'C:\program files\plikexe.exe,0'. Ale z tym sobie pewnie jakoś poradze.

0

Ok. Znalazłęm:)

procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture.Icon.Handle := GetAssociatedIcon('.' + edit1.text, True);
end;

function TForm1.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
else
Flags := SHGFI_ICON or SHGFI_LARGEICON or SHGFI_USEFILEATTRIBUTES;

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

Co prawda nie działa mi dla htm/html - powinna sie pojawiać ikonka opery a pojawia sie ta ogólna - domyślna dla nieskojarzonego pliku. Jak ktoś wie o co chodzi to jestem otwarty:)

Żródło: http://torry.net/ dział Tips. Thx dla kolegi Mitas'a

0

p.s. u mnie mam zainstalowaną operę i jak wpiszę html lub htm to jest ikona opery nie wiem co jest nie tak u Ciebie.

0

Gdyby komuś nie wystarczał przykłąd to tutaj:
http://www.codeguru.com/Cpp/controls/imagelist/article.php/c5499/
jest super programik wraz ze źródłem. Niestety w C++ ale tu chodzi raczej o sposób a nie o jezyk. Pozdrawiam.

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