Autor Beitrag
MartinPb
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 698



BeitragVerfasst: Mi 02.06.04 15:04 
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.

_________________
Gruß
Martin
MartinPb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 698



BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
  {Liefert den Pfad eines virtuellen Ordners}
function SpecialDirectory(ID: Integer): String//uses Shlobj;
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;

_________________
Gruß
Martin
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 02.06.04 15:32 
Die Suche im MSDN 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;
ausblenden Quelltext
1:
#define CSIDL_COMMON_APPDATA            0x0023      // All Users\Application Data					
MartinPb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 698



BeitragVerfasst: 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.

_________________
Gruß
Martin
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Mi 02.06.04 16:19 
in der unit ShFolder gibt es die funktion SHGetFolderPath, die auch unter win98 funktioniert:

ausblenden 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;


:)

_________________
mfg.
mâximôv
MartinPb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 698



BeitragVerfasst: 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.

ausblenden 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;

_________________
Gruß
Martin
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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. ;)