Entwickler-Ecke

Dateizugriff - Speicherfreigabe bei SHGetPathFromIDList


Mathematiker - Sa 14.04.12 18:21
Titel: Speicherfreigabe bei SHGetPathFromIDList
Hallo,
bei einer langen Suche im Forum habe ich eine Vielzahl von Beiträgen zum Problem Anwenderverzeichnis gefunden.
Besonders interessant finde ich

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  pIdL: PItemIDList;
  Path: Array [0..Max_Path] Of Char;
Begin
  // ItemIdList für den Favorites Ordner holen
  SHGetSpecialFolderLocation (0, CSIDL_APPDATA, pIdL);
  // ItemIdList in String umwandeln lassen
  SHGetPathFromIDList (pIDL, Path);
  // String (Verzeichnis) in Messagebox anzeigen lassen
  MessageDlg (Path, mtInformation, [mbOK], 0);
end;

da dort kein(!) ActiveX verwendet wird und ich auch gern auf ActiveX verzichten möchte.
Allerdings habe ich gelesen, dass SHGetPathFromIDList Speicherplatz reserviert, der nicht automatisch freigegeben wird. Weiß jemand, wie ich den Speicher freigeben kann?

Beste Grüße
Mathematiker

Moderiert von user profile iconNarses: 2. Frage entfernt.


Mathematiker - Mo 16.04.12 09:57

Hallo,
es tut mir leid, dass ich nerve. 40 Leute haben bisher meine Anfrage angesehen und leider keine Antwort.
Wenn die Frage wirklich zu dämlich :bawling: ist, dann sagt es mir bitte.
Beste Grüße
Mathematiker


Narses - Mo 16.04.12 10:16

Moin!

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Wenn die Frage wirklich zu dämlich :bawling: ist, dann sagt es mir bitte.
Schonmal von der MSDN-Library gehört? :zwinker:

Wie hier nachzulesen ist [http://msdn.microsoft.com/en-us/library/bb762203(v=vs.85).aspx], ist die Funktion SHGetSpecialFolderLocation() veraltet und sollte durch SHGetFolderLocation() [http://msdn.microsoft.com/en-us/library/bb762180(v=vs.85).aspx] ersetzt werden. Weiterhin ist hier der Grund für das "Speicher-Problem":
MSDN-Library hat folgendes geschrieben:
A PIDL specifying the folder's location relative to the root of the namespace (the desktop). It is the responsibility of the calling application to free the returned IDList by using [url=http://msdn.microsoft.com/en-us/library/ms680722(v=vs.85).aspx]CoTaskMemFree[/url].
Folglich ist es nicht unbedingt nötig, in Delphi die ActiveX-Unit einzubinden, aber die meisten werden zu faul gewesen sein, diese Funktion selbst nochmal zu kapseln, da sie dort (vermutlich?) schon drin ist. :nixweiss: Das ändert aber nix an der Eigentümerschaft an dem Speicher, du musst also auf jeden Fall selbst freigeben. :idea:

Ich habe diese ganze Problematik jetzt nicht im Detail untersucht, sondern lediglich den Einstieg in die Doku gesucht. ;) Für weitere Details bitte selbst :les: .

cu
Narses