text: Delphi Unit zur Verwendung von SHGetKnownFolderPath - Delphi-PRAXiS
  Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Unit zur Verwendung von SHGetKnownFolderPath
  Unit zur Verwendung von SHGetKnownFolderPath
  Ein Thema von ringli · begonnen am 11. Jun 2009 · letzter Beitrag vom 19. Sep 2018
  11. Jun 2009, 15:00
  Wie einige sicher wissen hat sich in Vista (und höher) die Ermittlung von Systemordnern geändert. Ab Vista sollte zur Ermittlung von Systemordnern nur noch die Funktion SHGetKnownFolderPath verwendet werden. Die bisher verwendete Funktion SHGetFolderPath und die CSIDL-Konstanten sind nur noch aus Kompatibilitätsgründen vorhanden. Da ich bisher keine komplette Delphi-Implementation gefunden habe, habe ich die angehängte Unit erstellt. Vielleicht kann der ein oder andere sie gebrauchen.
  Die Verwendung der Unit ist einfach:
  ...uGetKnownFolderPath;
  ws := GetKnownFolderPath(FOLDERID_Windows);
  ShowMessage(ws);
  Dieser Aufruf gibt bspw. C:\Windows zurück. Die Bedeutung der einzelnen FOLDERID's kann im MSDN nachgelesen werden.
  ugetknownfolderpath_143.pas (9,5 KB, 292x aufgerufen)
  11. Jun 2009, 19:42
  Dieses Thema wurde von "Matze" von "Windows API / MS.NET Framework API" nach "Neuen Beitrag zur Code-Library hinzufügen" verschoben.
  Das ist was für die Code-Library.
  AW: Unit zur Verwendung von SHGetKnownFolderPath
  13. Jul 2016, 15:13
  Vielen dank, daß Du Dir die Mühe gemacht hast, jetzt kann ich doch noch ein wenig bei D7 bleiben.
  Habe die Unit mal aktualisiert so das jetzt auch die neueren Folder-ID's enthalten sind.
  uGetKnownFolderPath.pas (12,7 KB, 90x aufgerufen)
  Geändert von ringli (27. Sep 2016 um 13:34 Uhr)
  27. Sep 2016, 11:57
  Hallo Ringli
  Danke für die Unit,
  aber eine Anmerkung: Dein Code gibt den Speicher nicht frei.
  Ich habe es so geändert:
  function GetKnownFolderPath(const rfid: TGUID): string;
  OutPath : PWideChar;
  if ShGetKnownFolderPath(rfid, 0, 0, OutPath) {>= 0} = S_OK then
  Result := OutPath;
  // From MSN
  // ppszPath [out]
  // Type: PWSTR*
  // When this method returns, contains the address of a pointer to a null-terminated Unicode string that specifies the path of the known folder
  // The calling process is responsible for freeing this resource once it is no longer needed by calling CoTaskMemFree.
  // The returned path does not include a trailing backslash. For example, "C:\Users" is returned rather than "C:\Users\".
  CoTaskMemFree(OutPath);
  Benötigt auch noch die WinApi.ActiveX im uses.
  Geändert von Fritzew (27. Sep 2016 um 12:38 Uhr)
  27. Sep 2016, 12:43
  Danke für den Hinweis. Habe den Anhang entsprechend aktualisiert.
  27. Sep 2016, 12:47
  Du musst aber die Funktion noch auf Rückgabe String ändern.......
  Dein Result zeigt auf den freigegebenen Speicher
  function GetKnownFolderPath(const rfid: TGUID) : string; // Hier
  17. Sep 2018, 12:05
  In einem anderen Forum sagte jemand, man solle in diesem Zusammenhang eher Winapi.Ole2.CoTaskMemFree statt Winapi.ActiveX.CoTaskMemFree verwenden.
  Geändert von PeterPanino (17. Sep 2018 um 12:12 Uhr)
  17. Sep 2018, 12:26
  Gar nichts, aber wenn man Dateigröße sparen mag und nur das CoTaskMemFree benötigt ohne Zusatz Units einzubinden die die .exe aufblähen, nutze ich die Api direkt procedure CoTaskMemFree(pv: Pointer); stdcall; external 'ole32.dll';
  Das sind wir von dir ja gewohnt.
  Sparen ist zwar allgemein ein gutes Argument (der Weltspartag findet alljährlich in der letzten Oktoberwoche statt), das aber nicht die Frage selbst beantwortet, obwohl diese von dir ausdrücklich zitiert wurde.