Delphi-PRAXiS
Seite 1 von 3  1 23   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Unit zur Verwendung von SHGetKnownFolderPath (https://www.delphipraxis.net/135471-unit-zur-verwendung-von-shgetknownfolderpath.html)

ringli 11. Jun 2009 15:00


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:
uses
   ...uGetKnownFolderPath;

.
.
.
procedure TForm1.Button1Click(Sender: TObject);
var
  ws : WideString;
begin
  ws := GetKnownFolderPath(FOLDERID_Windows);
  ShowMessage(ws);
end;
Dieser Aufruf gibt bspw. C:\Windows zurück. Die Bedeutung der einzelnen FOLDERID's kann im MSDN nachgelesen werden.

DP-Maintenance 11. Jun 2009 19:42

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.

p80286 13. Jul 2016 15:13

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

ringli 26. Sep 2016 18:56

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.

Fritzew 27. Sep 2016 11:57

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:
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;
Benötigt auch noch die WinApi.ActiveX im uses.

ringli 27. Sep 2016 12:43

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Danke für den Hinweis. Habe den Anhang entsprechend aktualisiert.

Fritzew 27. Sep 2016 12:47

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

PeterPanino 17. Sep 2018 12:05

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
In einem anderen Forum sagte jemand, man solle in diesem Zusammenhang eher
Delphi-Quellcode:
Winapi.Ole2.CoTaskMemFree
statt
Delphi-Quellcode:
Winapi.ActiveX.CoTaskMemFree
verwenden.

Was haltet ihr davon?

KodeZwerg 17. Sep 2018 12:26

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Zitat:

Zitat von PeterPanino (Beitrag 1413351)
In einem anderen Forum sagte jemand, man solle in diesem Zusammenhang eher
Delphi-Quellcode:
Winapi.Ole2.CoTaskMemFree
statt
Delphi-Quellcode:
Winapi.ActiveX.CoTaskMemFree
verwenden.

Was haltet ihr davon?

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
Delphi-Quellcode:
procedure CoTaskMemFree(pv: Pointer); stdcall; external 'ole32.dll';

PeterPanino 17. Sep 2018 12:40

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Zitat:

Zitat von KodeZwerg (Beitrag 1413354)
Gar nichts

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.

Bitte gehe nächstes Mal auf die Fragen bzw. auf die Kommentare der Benutzer ein.


Alle Zeitangaben in WEZ +2. Es ist jetzt 04:21 Uhr.
Seite 1 von 3  1 23   

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf