Entwickler-Ecke

Windows API - CSIDL_PROFILES


ASMFreak - Fr 09.07.10 07:51
Titel: CSIDL_PROFILES
Noch'n Moin!

Ich bin heute fleißig!

Bei folgender CSIDL bin ich ratlos, da die Informationen im Netz unterschiedlich sind:
 CSIDL_PROFILES

Der Logik nach - es gibt CSIDL_PROFILE (ohne "S"), das den Pfad zum Profil des Users repräsentiert - sollte CSIDL_PROFILES den Pfad repräsentieren, in denen die Benutzerprofile liegen - also den parent path von CSIDL_PROFILE. Das wird auch von einigen Quellen im Netz bestätigt. Microsoft schweigt sich dagegen in der Dokumentation über die Existenz dieser CSIDL aus. Delphi dagegen deklariert die Konstante in ShlObj, sodass sie eine Funktion haben muss. Dennoch führt der Aufruf der betreffenden Funktionen mit dieser CSIDL bei mir nicht zum gewünschten Erfolg. Woran liegt's?

Danke und Gruß, Trutz


Moderiert von user profile iconChristian S.: Topic aus Open Source Units verschoben am Fr 09.07.2010 um 09:02


trm - Fr 09.07.10 08:00

Nur als Idee: liegt es vielleicht an Deinen Benutzerrechten, dass es nicht klappt?


ASMFreak - Fr 09.07.10 08:03

Nee, auch als Administrator funktioniert's nicht!

Und apropros:
Der Pfad dahin unterliegt ja keinen Beschränkungen, ich kann den Pfad "C:\Users", der durch CSIDL-PROFILES eigentlich zurückgegeben weden sollte, prima als Nicht-Administrator öffnen.


trm - Fr 09.07.10 09:28

Hm, stimmt.
Bei mir (Win7x64) geht auch nur PROFILE.

Wie ist denn die Deklaration bei den CSIDL, ich habe unter Delphi7 leider keine Werte finden können, dhaer selbst zugewiesen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
const
  SHGFP_TYPE_CURRENT = 0;
  CSIDL_PROFILES =$3e;
  CSIDL_PROFILE= $28;
var
  path: array[0..MAX_PATH] of char;
begin

    SHGetFolderPath(0, CSIDL_PROFILES, 0, SHGFP_TYPE_CURRENT, @path[0]) ;
    showmessage(path);
end;


ASMFreak - Fr 09.07.10 09:30

Korrekt!


trm - Fr 09.07.10 11:17

Huhu.

Guck mal, vielleicht hilft Dir das weiter..



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:
24:
25:
26:
27:
procedure TForm1.Button1Click(Sender: TObject);
uses
  SHFolder;

const
  SHGFP_TYPE_CURRENT = 0;
  CSIDL_PROFILES = $3E;
  CSIDL_PROFILE = $28;
var
  path: array[0..MAX_PATH] of char;
  x: integer;
  Dummy_String,Hex_String: string;
begin

  memo1.Clear;
  for x := 0 to 10240 do
  begin
    SHGetFolderPath(0, x, 0, SHGFP_TYPE_CURRENT, @path[0]);
    Dummy_String := path;
    if length(trim(Dummy_String)) > 0 then
      Memo1.lines.Add(format('%d ($%s) -> %s', [x, IntToHex(x,100),Dummy_String]));
    path[0] := #0;
    if x mod 25 = 0 then
      Application.Processmessages;
  end;

end;


1 Memo wird benötigt und 1 Button.

Komischerweise werden NUR beim ermitteln der Pfade unter Windows7x64 auf meinem Desktop 2 Dateien erstellt: Desktop.ini (einmal im echten Pfad und 1x sonstwo).


ASMFreak - Fr 09.07.10 12:23

Nee, nicht wirklich: zwischen $3B und $100 klafft eine ziemliche Lücke ...

Ich hab mich also damit abgefunden, dass es nicht geht. Ist ja auch egal, wenn man's braucht, kann man einfach über CSIDL_PROFILE (ohne s ) gehen und das letzte SubDir entfernen ..

Dachte bloß, jemand weiß vielleicht Genaueres.