![]() |
GetSpecialFolder
Hallo,
ich möchte in einem Programm den Systempfad für "Dokumente für alle Benutzer ermitteln". Das mache ich mit der Funktion "GetSpecialFolder" und CSIDL_COMMON_DOCUMENTS als Parameter.
Delphi-Quellcode:
Prinzipiell funktioniert das auch ganz gut. Ich habe aber jetzt den Fall, daß das Ergebnis der Funktion ein leerer String ist. Meine Vermutung ist, daß "pMalloc = nil" ist und die Funktion beendet wird. Aber warum ?
function GetSpecialFolder (CSIDL: Integer) : String;
var ItemIDList: PItemIDList; sFolderPath : String; iSystemFolder : Integer; pMalloc : IMalloc; begin pMalloc := nil; sFolderPath := ''; SHGetMalloc (pMalloc); if (pMalloc = nil) then begin Exit; end; try iSystemFolder := CSIDL; if (SUCCEEDED (SHGetSpecialFolderLocation (0, iSystemFolder, ItemIDList))) then begin SetLength (sFolderPath, MAX_PATH); if (SHGetPathFromIDList(ItemIDList, PChar(sFolderPath))) then begin SetLength (sFolderPath, Length(PChar(sFolderPath))); end; end; finally Result := sFolderPath; pMalloc.Free(ItemIDList); end; end; Was könnte die Ursache sein und wie kann ich darauf reagieren ? mfG Mike |
Re: GetSpecialFolder
Da gibt es doch eine fertige API-Funktion dafür.
Der kannst Du mitgeben, welchen SpecialFolder Du suchst. Leider hab ich grad den Namen vergessen und das Delphi momentan nicht gestartet. |
Re: GetSpecialFolder
Ich hatte mal ein relativ ähnliches Problem. Allerdings konnte ich nie wirklich herausfinden wieso es zu dem Problem kommt. Ich hab stattdessen begonnen die entsprechenden APIs zu meiden und mir den Wert einfach selbst aus der Registry gefischt:
Delphi-Quellcode:
Solltest Du also keine Lösung für Dein Problem finden, hast Du hier wenigstens eine Alternative :).
program Project1;
{$APPTYPE CONSOLE} uses registry, windows; //FIXME: Diese Funktion ist ANSI only, bedeutet UNICODE Pfade werden nicht // korrekt zurückgeliefert function GetRegistryPath(valuename : string) : string; begin result := ''; with TRegistry.Create do begin RootKey := HKEY_LOCAL_MACHINE; OpenKeyReadOnly('\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer'+ '\Shell Folders'); if ValueExists(valuename) then result := ReadString(valuename); CloseKey; Free; end; end; begin writeln(GetRegistryPath('Common Documents')); readln; end. |
Re: GetSpecialFolder
Zitat:
|
Re: GetSpecialFolder
Zitat:
![]() Zitat:
|
Re: GetSpecialFolder
mit dem RootKey HKEY_LOCAL_MACHINE findest Du aber nur die Sachen für AllUsers.
Wenn Du die Sachen des aktuellen USers haben möchtest, musst Du HKey_CURRENT_USER verwenden. |
Re: GetSpecialFolder
Zitat:
Zitat:
Mike |
Re: GetSpecialFolder
Zitat:
|
Re: GetSpecialFolder
Hilfe lesen:
Zitat:
Zitat:
![]() |
Re: GetSpecialFolder
Zitat:
1. SHGetSpecialFolderLocation ist von der Benutzung her extrem umständlich. 2. SHGetSpecialFolderLocation neigt dazu aus heiterem Himmel fehl zu schlagen. 3. SHGetSpecialFolderLocation hat einen gigantischen Overhead. Die Limitierung, daß die Registry Keys erst nach der ersten Verwendung von SHGetSpecialFolderLocation erstellt werden, ist für die Werte, die hier abgefragt werden irrelevant, da sie auch bei einem frisch installiertem Windows bereits existieren. Allerdings bin ich wahrscheinlich einfach nur zu ungebildet und pragmatisch veranlagt ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:39 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