Entwickler-Ecke
Windows API - Suche Konstante für AllUsers-Anwendunsdaten-Ordner
MartinPb - Mi 02.06.04 15:04
Titel: Suche Konstante für AllUsers-Anwendunsdaten-Ordner
Ich programmiere gerade mit einer älteren Version von Delphi und komme nicht an die Units um es selbst nachzugucken. Der jeweils gültige Anwendunsdaten-Ordner ist zu ermitteln mit der CSIDL_APPDATA Konstante. Allerdings brauche ich auch die Konstante für Anwendunsdaten-Ordner aller User. Wäre schön wenn mir einer den nennen könnte und auch den Integerwert dazu.
MartinPb - Mi 02.06.04 15:21
Ich kamm gerade auf die Idee mit einer For Schleife anstelle der Konstanten alle Werte von 0 bis 100 auszuprobieren. Anscheinend liefert meine Funktion den AllUsers\Anwendungsdaten Ordner
nicht zurück. Wer weiß wie ich ich an den Ordner komme? Mit dieser Funktion geht es nicht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function SpecialDirectory(ID: Integer): String; var Pidl : PItemIDList; Path : PChar; begin if Succeeded(SHGetSpecialFolderLocation(0, ID, Pidl)) then begin Path := StrAlloc(MAX_PATH); SHGetPathFromIDList(Pidl, Path); Result := String(Path); end else Result := ''; end; |
Delete - Mi 02.06.04 15:32
Die
KONSTANTE lautet eigentlich
CSIDL_COMMON_APPDATA. Das Problem ist aber, dass sie erst ab Version 5.0 der "shell32.dll" (IMHO, also ab 2000 und höher, evtl. auch ME?) zur Verfügung steht. Damit ergibt sich das nächste Problem: Ich habe den Ordner auch unter 98. ;)
Die beste Lösung, IMHO, wäre wohl, den Profilpfad für "All Users" zu ermitteln und dann zu prüfen, ob es sozusagen "%all users%\Anwendungsdaten" gibt.
PS: Wenn dein Delphi evtl. etwas älter ist, kennt es die Konstante natürlich nicht. Laut PSDK ("ShFolder.h") hat sie den Wert $0023;
Quelltext
1:
| #define CSIDL_COMMON_APPDATA 0x0023 // All Users\Application Data |
MartinPb - Mi 02.06.04 15:59
Wie ich schon oben geschrieben habe bringt der Wert nichts. Ich habe alle Werte per Schleife ausprobiert und keiner liefert den gewünschten Pfad zurück. Ich könnte mir den Pfad zusammenstellen, in dem ich einfach annehme, daß er unter Windows abgelegt ist. Allerdings ist das Murks. Das beste was mir noch eingefallen ist, daß war in der Reistry zu suchen. In desem Pfad:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\Shell Folders
Hab ich unter Common AppData den gewünschten Pfad gefunden. Ich weiß aber nicht ob das auch für andere Systeme gilt, wie z.B. Windows 2000 oder XP. Wenn das so wäre, dann könnte ich mir den Pfad da holen.
maximus - Mi 02.06.04 16:19
in der unit ShFolder gibt es die funktion SHGetFolderPath, die auch unter win98 funktioniert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| uses
SHfolder;
function GetFolder2(hWindow: HWND; Folder: Integer): String; var Path: PChar; hr:HRESULT; begin path := StrAlloc(MAX_PATH+1); hr := SHGetFolderPath(hWindow,Folder,0,0,path); if hr = S_OK then Result := Path else result := ''; StrDispose(Path); end;
function GetDataFolder:string; begin result := IncludeTrailingPathDelimiter(GetFolder2(0,CSIDL_COMMON_APPDATA or CSIDL_FLAG_CREATE)); end; |
:)
MartinPb - Mi 02.06.04 17:20
Danke für den Tip, aber ich arbeite gerade mit einer älteren Version von Delphi und da gibt es keine SHfolder Unit. Aber ich werde mir den Tip für später merken. Deshalb hab ich mich für die Registry Methode entschieden. Es wäre schön wenn das einer unter Windows 2000 und XP testen würde. Eventuell auch noch unter NT. Dann wüßte ich, daß sie auch unter desen Systemen funktionieren.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| function Common_AppData_Folder: String; begin with TRegistry.Create do try RootKey := HKEY_LOCAL_MACHINE; OpenKey('Software\Microsoft\Windows\CurrentVersion\explorer\Shell Folders', False); Result := ReadString('Common AppData'); CloseKey; finally Free; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(Common_AppData_Folder); end; |
Delete - Mi 02.06.04 21:53
MartinPb hat folgendes geschrieben: |
Wie ich schon oben geschrieben habe bringt der Wert nichts. |
Und wie ich geschrieben habe, bringt er deshalb nichts weil er eine bestimmte Windows-Version voraussetzt.
Zitat: |
Deshalb hab ich mich für die Registry Methode entschieden. |
Das solltest du eben nicht tun. Es funktioniert zwar, aber es ist nicht sicher, dass das auf jedem Windows so sein wird. Darum gibt es ja die Shell-Funktionen, mit denen du solche Ordner ermitteln kannst. Außerdem wird dieser Ordner IMHO nur von ein paar Microsoft-Produkten angelegt (bei mir wird´s wohl Office gewesen sein), denn wenn das PSDK sagt, dass es den Wert bspw. unter 98 nicht gibt, dann gehe ich mal davon aus, dass er ursprünglich auch nie dafür vorgesehen war. ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!