![]() |
Unit zur Verwendung von SHGetKnownFolderPath
Liste der Anhänge anzeigen (Anzahl: 1)
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:
Delphi-Quellcode:
Dieser Aufruf gibt bspw. C:\Windows zurück. Die Bedeutung der einzelnen FOLDERID's kann im
uses
...uGetKnownFolderPath; . . . procedure TForm1.Button1Click(Sender: TObject); var ws : WideString; begin ws := GetKnownFolderPath(FOLDERID_Windows); ShowMessage(ws); end; ![]() |
DP-Maintenance
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
@ringli
Vielen dank, daß Du Dir die Mühe gemacht hast, jetzt kann ich doch noch ein wenig bei D7 bleiben.:thumb: Gruß K-H |
AW: Unit zur Verwendung von SHGetKnownFolderPath
Liste der Anhänge anzeigen (Anzahl: 1)
Habe die Unit mal aktualisiert so das jetzt auch die neueren Folder-ID's enthalten sind.
|
AW: Unit zur Verwendung von SHGetKnownFolderPath
Hallo Ringli
Danke für die Unit, aber eine Anmerkung: Dein Code gibt den Speicher nicht frei. Ich habe es so geändert:
Delphi-Quellcode:
Benötigt auch noch die WinApi.ActiveX im uses.
function GetKnownFolderPath(const rfid: TGUID): string;
var OutPath : PWideChar; begin if ShGetKnownFolderPath(rfid, 0, 0, OutPath) {>= 0} = S_OK then begin 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); end else begin Result := ''; end; end; |
AW: Unit zur Verwendung von SHGetKnownFolderPath
Danke für den Hinweis. Habe den Anhang entsprechend aktualisiert.
|
AW: Unit zur Verwendung von SHGetKnownFolderPath
Du musst aber die Funktion noch auf Rückgabe String ändern.......
Dein Result zeigt auf den freigegebenen Speicher :-D
Delphi-Quellcode:
function GetKnownFolderPath(const rfid: TGUID) : string; // Hier
|
AW: Unit zur Verwendung von SHGetKnownFolderPath
In einem
![]()
Delphi-Quellcode:
statt
Winapi.Ole2.CoTaskMemFree
Delphi-Quellcode:
verwenden.
Winapi.ActiveX.CoTaskMemFree
Was haltet ihr davon? |
AW: Unit zur Verwendung von SHGetKnownFolderPath
Zitat:
Delphi-Quellcode:
procedure CoTaskMemFree(pv: Pointer); stdcall; external 'ole32.dll';
|
AW: Unit zur Verwendung von SHGetKnownFolderPath
Zitat:
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. Bitte gehe nächstes Mal auf die Fragen bzw. auf die Kommentare der Benutzer ein. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz