Hibásan működő SHGetFileInfo x64 alatt.

Hibásan működő SHGetFileInfo x64 alatt.
2009-08-06T18:55:53+02:00
2009-08-11T18:55:44+02:00
2022-11-14T15:20:46+01:00
Rogerrr
Hello!

Egy régebben összerakott programot szeretnék működésre bírni úgy, hogy x64-es rendszeren is menjen. Most ismét egy akadályba ütköztem, ami az SHGetFileInfo használatánál jött elő.

Vannak esetek, amikor bizonyos parancsikonok-ból nem sikerül kiszednem annak ikonját, és(vagy) annak Windowsos megnevezését.

A példa kedvéért most kiragadtam egyet, mégpedig ezt:
Vista 64 alatt a Start/Minden program/Kellékek/Táblaszámítógép/Windows Jegyzetfüzet

Elérési útvonala nálam, amit a program el is tud érni.
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Accessories\Tablet PC\Windows Journal.lnk


A jelenség(ek) a következő(ek):

A Windows Jegyzetfüzet helyett->szDisplayName Windows Journal lesz.

A jó ikon helyett csak amolyan "alap" ikon jön vissza.

Ha elérési útnak csak azt adom meg:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Accessories\Tablet PC\, akkor

Az ikon megfelelően jelenik meg!

A Táblaszámítógép mappanév helyett->szDisplayName Tablet PC lesz.


function GetDisplayName(const FileName: string): string; var SHFileInfo: TSHFileInfo; begin FillChar(SHFileInfo, SizeOf(SHFileInfo), 0); if SHGetFileInfo(PAnsiChar(FileName),0,SHFileInfo,SizeOf(SHFileInfo), SHGFI_DISPLAYNAME) <> 0 then Result:=SHFileInfo.szDisplayName; end; function GetIcon(sPath: string): HICON; var SFI: TSHFileInfo; begin SHGetFileInfo(PAnsiChar(sPath), 0, SFI, SizeOf(ShFileInfo), SHGFI_ICON); Result:=SFI.hIcon; end; procedure TForm1.Button1Click(Sender: TObject); var icon: HICON; begin icon:=GetIcon(Edit1.Text); if FileExists(Edit1.Text) or DirectoryExists(Edit1.Text) then Image1.Picture.Icon.Handle:=icon; end; procedure TForm1.Button2Click(Sender: TObject); begin Label1.Caption:=GetDisplayName(Edit1.Text); end;


A Játékok alatti programok parancsikonjánál -az összesnél- ez a helyzet!!! Meg még van egy-kettő, ahol ez előfordul...

Mi lehet a gond?
Köszönöm!

Rogerrr
Mutasd a teljes hozzászólást!
Vista bug ne is torodj vele
Mutasd a teljes hozzászólást!

  • A 16 bites alkalmazasokbol nem lehet kinyerni az icont; a windows fejlesztok kiszedtek(valamere olvastam)
    A 32 es 64 bites alkalmazasokkal nem tudom mi a helyzett.
    Itt levo kod mukodik vistan?
    Mutasd a teljes hozzászólást!
  • Igen működik, de ez teljesen más... Ez a shell32.dll-ből veszi ki az adott kiterjesztéshez társított ikonokat. Ez megy 32 és 64-es Vistán is, hiszen 64 alatt is van Windows\System32 mappa, amiben ott a shell32.dll...
    Mutasd a teljes hozzászólást!
  • A .lnk egy parancsikon, abban benne van az ikon? Szerintem az exe-ben van az ikon amire mutat.

    Persze lehet, hogy így csinálod, akkor bocs
    Mutasd a teljes hozzászólást!
  • Persze, de egy lnk nem csak exe-re mutathat...
    Amúgy az eljárás csak x64 alatt zavarodik meg, mert amúgy
    megy ez 98-tól Windows7-ig...

    ShellExecute-nál már adódhat/adódhatnának gondok, hisz ott érthető, ha pl. indítási útvonalban a Program Files nem Program Files, hanem Program Files (x86), de ez egy másik dolog. Ott lehet variálni a Wow64DisableWow64FsRedirection-el...

    És ha most nem az ikon kinyerését nézem, hanem az SHGetFileInfo...SHGFI_DISPLAYNAME...-t, akkor nem értem, hogy pl. a Windows Journal mért nem Windows Jegzetfüzetként tér vissza. (amúgy a többi kettő, ami még a Tablet PC mappában van azok megnevezése meg jól olvasható ki...)



    Mutasd a teljes hozzászólást!
  • Tesztelgettem egy kicsit.
    Kipróbáltam XP 64-en is, ott sem működik esetenként, de ha ott
    alkalmazom akár az ikon kinyerése, vagy a megnevezés kiolvasása előtt a Wow64DisableWow64FsRedirection-t (utána visszaállítva Wow64EnableWow64FsRedirection-el), akkor utána már minden esetben megfelelő lesz.

    Ha Vista x64-en csinálom ezt, akkor bizonyos fájloknál működik, de vannak esetek, amikor még ez sem segít... :(

    Windows7 x32 alatt minden frankón megy. Tehát az már biztos, hogy a 64-es rendszer kavar be a Special Folderek; EnvironmentStringek-nek köszönhetően.

    De azért azt mégsem értem, hogy valamelyiknél miért segít a disable redirection, valamelyiknél meg miért nem...?

    Egyébként az még benne van a pakliban -szerintem-, ha Xp 64-re telepítenék MUI-t, akkor ott is előfordul majd ez a jelenség...
    (Már ha van MUI XP 64-re, nem tudom)
    Mutasd a teljes hozzászólást!
  • Kipróbáltam már mindent, ami kipróbálható. Gyanakodom rá, hogy bug van a Vista x64-ben...
    Mutasd a teljes hozzászólást!
  • Azt azért, akinek 64-es Vistája van megtenné, hogy kipróbálja a Start Menü-ben található játékok valamelyikét, hogy nála működik-e a GetIcon funkció.... Köszönöm!


    function GetIcon(sPath: string): HICON; var SFI: TSHFileInfo; begin SHGetFileInfo(PAnsiChar(sPath), 0, SFI, SizeOf(ShFileInfo), SHGFI_ICON); Result:=SFI.hIcon; end; procedure TForm1.Button1Click(Sender: TObject); var icon: HICON; begin icon:=GetIcon(Edit1.Text); if FileExists(Edit1.Text) or DirectoryExists(Edit1.Text) then Image1.Picture.Icon.Handle:=icon; end;


    C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Games\InkBall.lnk
    (Persze ez változhat, de nagy valószínűséggel ez lesz...)

    Kösz!
    Mutasd a teljes hozzászólást!
  • Az már biztos, hogy olyan lnk fájloknál van a hiba, amelyek nem (x86)-os mappába mutatnak, mert a többin, ami pl. %SystemRoot%\system32\-be mutat, azokon segít a Wow64DisableWow64FsRedirection, és sikerül kiszedni az ikonokat.

    De tényleg érthetetlen, mivel ha elérési útnak a célfájlt adom meg(exe), akkor kiszedi az ikont...
    Mutasd a teljes hozzászólást!
  • Vista bug ne is torodj vele
    Mutasd a teljes hozzászólást!
  • Hello!

    Azt hiszem, hogy más magyarázat már tényleg nincs erre az egészre, mint az, hogy BUG-os a Vista. Már az összes lehetőséget kipróbáltam, amit csak kilehetett.

    Köszi!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd