AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Problem mit SHGetFileInfo und SHGFI_ICONLOCATION
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit SHGetFileInfo und SHGFI_ICONLOCATION

Offene Frage von "Mschmidt"
Ein Thema von Thebe · begonnen am 13. Sep 2005 · letzter Beitrag vom 3. Jan 2013
Antwort Antwort
Thebe

Registriert seit: 26. Jul 2004
Ort: Wedel
78 Beiträge
 
Delphi 6 Enterprise
 
#1

Problem mit SHGetFileInfo und SHGFI_ICONLOCATION

  Alt 13. Sep 2005, 12:24
Moin

Ich hab folgenden Code

Delphi-Quellcode:
var
  fi: SHFileInfo;
begin
  AFile := 'C:\irgendeine.bmp';

  SHGetFileInfo(pChar(AFile), 0, fi, SizeOf(fi), SHGFI_ICONLOCATION)

  // SHGFI_ICONLOCATION = Retrieve the name of the file that contains the icon representing the file specified by pszPath, as returned by the IExtractIcon::GetIconLocation method of the file's icon handler. Also retrieve the icon index within that file. The name of the file containing the icon is copied to the szDisplayName member of the structure specified by psfi. The icon's index is copied to that structure's iIcon member.
end;
Problem ist nur: szDisplayName beinhaltet nicht wider Erwarten nach der MSDN den Namen der Datei, wo das Icon abgespeichert is, sondern ist einfach nur leer. Ich habe erst gedacht ich hätte bei der weiteren Weiterverarbeitung nen Fehler beim Typecast gemacht, doch nachhem gesetzten Haltepunkt zeigt Delphi mir auch an das fi.szDisplayName komplett leer ist.

Woran kann sowas liegen ? Bin ich zu blöd nu drei bzw. vier Parameter zu übergeben oder liegt das anner WinAPI ?

MfG
- Thebe
  Mit Zitat antworten Zitat
Thebe

Registriert seit: 26. Jul 2004
Ort: Wedel
78 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: Problem mit SHGetFileInfo und SHGFI_ICONLOCATION

  Alt 15. Sep 2005, 18:17
*schiiiieeeb*

Keiner ne Ahnung woran das liegen könnte ??
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Problem mit SHGetFileInfo und SHGFI_ICONLOCATION

  Alt 15. Sep 2005, 18:30
Was hast du denn für eine Datei angegeben?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Problem mit SHGetFileInfo und SHGFI_ICONLOCATION

  Alt 15. Sep 2005, 19:02
Zitat von Thebe:
Moin

Ich hab folgenden Code

Delphi-Quellcode:
var
  fi: SHFileInfo;
begin
  AFile := 'C:\irgendeine.bmp';

  SHGetFileInfo(pChar(AFile), 0, fi, SizeOf(fi), SHGFI_ICONLOCATION)

  // SHGFI_ICONLOCATION = Retrieve the name of the file that contains the icon representing the file specified by pszPath, as returned by the IExtractIcon::GetIconLocation method of the file's icon handler. Also retrieve the icon index within that file. The name of the file containing the icon is copied to the szDisplayName member of the structure specified by psfi. The icon's index is copied to that structure's iIcon member.
end;
Problem ist nur: szDisplayName beinhaltet nicht wider Erwarten nach der MSDN den Namen der Datei, wo das Icon abgespeichert is, sondern ist einfach nur leer. Ich habe erst gedacht ich hätte bei der weiteren Weiterverarbeitung nen Fehler beim Typecast gemacht, doch nachhem gesetzten Haltepunkt zeigt Delphi mir auch an das fi.szDisplayName komplett leer ist.

Woran kann sowas liegen ? Bin ich zu blöd nu drei bzw. vier Parameter zu übergeben oder liegt das anner WinAPI ?

MfG
- Thebe
Naja, ein bischen logisch denken wäre nicht soo schlecht
Delphi-Quellcode:
  SHGetFileInfo(pChar(AFile), 0, fi, SizeOf(fi), SHGFI_ICONLOCATION or SHGFI_TYPENAME or SHGFI_DISPLAYNAME);
  ShowMessage('Displayname: '+strpas(fi.szDisplayName)+#13+
              'Typename: '+strpas(fi.szTypeName)+#13+
              'IIcon: '+IntToStr(fi.IIcon));
  if fi.hIcon > 0 then
     DestroyIcon(fi.hIcon);
Wenn Du im Member DisplayName was drinstehen haben möchtest, dann musst Du das der Funktion auch in den Flags (SHGFI_DISPLAYNAME) mitteilen. Das DestroyIcon sollte man auch nicht vergessen, wenn man im Rahmen von Spielereien mal SHGFI_ICON verwendet...
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Thebe

Registriert seit: 26. Jul 2004
Ort: Wedel
78 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: Problem mit SHGetFileInfo und SHGFI_ICONLOCATION

  Alt 15. Sep 2005, 22:22
@Luckie: PDF, BMP u. XLS Dateien von meiner Festplatte, Pfad war korrekt und die Dateien waren existent.

@Union:

Zitat:
Naja, ein bischen logisch denken wäre nicht soo schlecht
Ähm... hab ich, hab ich...

Ma ne Beschreibung von SHGFI_DISPLAYNAME vonna MSDN Seite:
Zitat:
SHGFI_DISPLAYNAME
Retrieve the display name for the file. The name is copied to the szDisplayName member of the structure specified in psfi. The returned display name uses the long file name, if there is one, rather than the 8.3 form of the file name.
Sprich das Ding gibt mir nur den Dateinamen für die Datei zurück, so wie er im Explorer angezeigt wird. Wenn ich also SHGetFileInfo als Pfad "C:\irgendeine.bmp" übergebe, dann krieg ich als szDisplayName "irgendeine.bmp" wieder und nicht die Datei, in der das Icon für .bmp Dateien abgespeichert ist.

Aber danke für die Antwort
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Problem mit SHGetFileInfo und SHGFI_ICONLOCATION

  Alt 29. Dez 2012, 05:53
Ich hab 1:1 dasselbe Problem. Gibt es inzwischen eine Lösung?
  Mit Zitat antworten Zitat
Mschmidt

Registriert seit: 4. Jul 2010
Ort: Berlin
62 Beiträge
 
Delphi XE2 Professional
 
#7

AW: Problem mit SHGetFileInfo und SHGFI_ICONLOCATION

  Alt 3. Jan 2013, 17:24
Ich hab hier was. Ich brauch das Icon der Datei. Vielleicht hilfts.

Delphi-Quellcode:
function GetGenericIconIndex( AExtension: string ): integer;
{ Get icon index for an extension type }
var
  AInfo: TSHFileInfo;
begin
  if SHGetFileInfo( PChar( AExtension ), FILE_ATTRIBUTE_NORMAL, AInfo, SizeOf( AInfo ),
    SHGFI_SYSICONINDEX or SHGFI_LARGEICON or SHGFI_USEFILEATTRIBUTES ) <> 0 then
  Result := AInfo.iIcon
  else
    Result := -1;
end;

procedure BuildImageList;
var FileInfo: TSHFileInfo;
 dw:DWORD;
begin
  Inherited Create(AOwner);
  fImageList:= TImageList.Create(self);
  dw:=SHGetFileInfo('', 0, FileInfo, SizeOf(TSHFileInfo),
      SHGFI_LARGEICON or SHGFI_SYSICONINDEX );
  if dw>0 then begin
    fImageList.Width:= 32;
    fImageList.Height:=32;
    fImageList.ShareImages:= True;
    fImageList.Handle:= dw;
    List.LargeImages:= fImageList;// is a TListView !
  end;
end;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz