Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Icon via SHGetFileInfo und GUID unter Vista ermitteln (https://www.delphipraxis.net/114827-icon-via-shgetfileinfo-und-guid-unter-vista-ermitteln.html)

Bumbi 1. Jun 2008 11:14


Icon via SHGetFileInfo und GUID unter Vista ermitteln
 
Huhu :)
Ich würde gerne die Icons von "besonderen" Windows-Verzeichnissen benutzen (Systemsteuerung, Netzwerkverbindungen, Papierkorb etc). Bis XP klappt das auch wunderbar mit SHGetFileInfo, nur unter Vista gibts dann 'ne 0 als Icon-Handle. Die GUID's dieser Verzeichnisse bleiben auch die gleichen (über Registry geprüft).
Bisher habe Ich dafür eine erweiterte Funktion von Sunlight7 benutzt:
Delphi-Quellcode:
const
   BuSpecialFile_WorkStation                   = '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}';
   BuSpecialFile_Network                       = '::{208D2C60-3AEA-1069-A2D7-08002B30309D}';
   BuSpecialFile_NetworkConnections            = '::{7007ACC7-3202-11D1-AAD2-00805FC1270E}';
   BuSpecialFile_Search                        = '::{1f4de370-d627-11d1-ba4f-00a0c91eedba}';
   BuSpecialFile_RecycleBin                    = '::{645FF040-5081-101B-9F08-00AA002F954E}';
   BuSpecialFile_PrinterAndFax                 = '::{2227A280-3AEA-1069-A2DE-08002B30309D}';
   BuSpecialFile_Explorer                      = '::{450D8FBA-AD25-11D0-98A8-0800361B1103}';
   BuSpecialFile_ScheduledTasks                = '::{D6277990-4C6A-11CF-8D87-00AA0060F5BF}';
   BuSpecialFile_SearchResults                 = '::{e17d4fc0-5564-11d1-83f2-00a0c90dc849}';

   BuSpecialFile_SystemControl                 = '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}';
   BuSpecialFile_SystemControl_Print           = '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\::{2227A280-3AEA-1069-A2DE-08002B30309D}';
   BuSpecialFile_SystemControl_Tasks           = '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\::{D6277990-4C6A-11CF-8D87-00AA0060F5BF}';
   BuSpecialFile_SystemControl_Network         = '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\::{7007ACC7-3202-11D1-AAD2-00805FC1270E}';
   BuSpecialFile_SystemControl_ScannerAndCamera = '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\::{E211B736-43FD-11D1-9EFB-0000F8757FCD}';

function BuGetFileIcon(const Name:String;const Large:Boolean=false;Opened:Boolean=false;Selected:Boolean=false;Overlayed:Boolean=false;LinkOverlay:Boolean=false):HIcon;
var
  FileInfo: TSHFileInfo;
  Flags:   Integer;
begin
  ZeroMemory(@FileInfo, SizeOf(FileInfo));
  Flags := SHGFI_ICON;
  if Opened then
    Flags := Flags or SHGFI_OPENICON;
  if Selected then
    Flags := Flags or SHGFI_SELECTED;
  if Overlayed then
    Flags := Flags or SHGFI_ADDOVERLAYS;
  if LinkOverlay then
    Flags := Flags or SHGFI_LINKOVERLAY;
  if Large then
    Flags := Flags or SHGFI_LARGEICON
  else
    Flags := Flags or SHGFI_SMALLICON;
  SHGetFileInfo(PChar(Name), 0, FileInfo, SizeOf(FileInfo), Flags);
  Result := FileInfo.hIcon;
end;
Danke, Bumbi

rotfc 1. Jun 2008 11:21

Re: Icon via SHGetFileInfo und GUID unter Vista ermitteln
 
Wofür stehen denn die doppelten Doppelpunkte

unter XP
bzw.
unter Vista

DEINER Meinung nach?

Bumbi 1. Jun 2008 11:32

Re: Icon via SHGetFileInfo und GUID unter Vista ermitteln
 
Ich hatte angenommen, um anzugeben, dass es sich nicht um ein Laufwerk handelt. Liege Ich damit falsch?

rotfc 1. Jun 2008 12:03

Re: Icon via SHGetFileInfo und GUID unter Vista ermitteln
 
Zitat:

Zitat von Bumbi
Ich hatte angenommen, um anzugeben, dass es sich nicht um ein Laufwerk handelt. Liege Ich damit falsch?

Keine Ahnung, sag' Du es mir bitte ;-)

Unter Vista brauchst Du aber etwas andere Rechte für die Registry. Reine Leserechte z.B.?

Bumbi 1. Jun 2008 12:20

Re: Icon via SHGetFileInfo und GUID unter Vista ermitteln
 
Habe wohl vergessen, zu schreiben, dass es mit normalen Verzeichnissen etc funktioniert, wie es soll.
Da es mit den GUIDs auch nicht funktioniert, wenn Ich es als Administrator ausführe, denke Ich, kann ich Berechtigungsprobleme ausschließen.
Dass man unter Vista etwas anderes als die Doppelpunkte verwenden muss, könnte Ich mir auch vorstellen, nur finde Ich da über Google etc keine Erklärung für.

--Bumbi

rotfc 1. Jun 2008 13:02

Re: Icon via SHGetFileInfo und GUID unter Vista ermitteln
 
In einer Function werden wohl die doppelten Doppelpunkte durch irgendwas anderes ersetzt, oder?

Beim Starten Deines Programms muß also als erstes überprüft werden, ob Dein Programmm unter XP oder Vista läuft.

Je nach dem muß die Function (für die doppelten Doppelpunkte) anders reagieren.

Denke ich mir mal so...

Edith sagt "Denken unter Windows ist Glückssache". Wo sie Recht hat, hat sie Recht :-(
Ein XP-Admin hat viel mehr Rechte als ein Vista-Admin - in den Windows-Ordnern...

Bumbi 1. Jun 2008 19:40

Re: Icon via SHGetFileInfo und GUID unter Vista ermitteln
 
Bleibt nur noch die Frage, was Ich sonst vorne dran setze :wall:

--Bumbi

Christian Seehase 1. Jun 2008 22:08

Re: Icon via SHGetFileInfo und GUID unter Vista ermitteln
 
Moin Bumbi,

schau Dir doch mal das Beispiel für SHGetFileInfo im PSDK (oder MSDN) an.
Dort werden nicht die GUIDs verwendet, sondern es wird, mit Hilfe von SHGetFolderLocation und dem CSIDL_*-Wert (z.B. CSIDL_BITBUCKET) ein PIDL für das Objekt geholt, und damit dann SHGetFileInfo aufgerufen.
Vielleicht funktioniert dieser Weg ja auch unter Vista.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:31 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