Discussion:
Ordner "Eigene Dateien" ansprechen
(zu alt für eine Antwort)
Frank Fischer
2006-03-03 12:48:11 UTC
Permalink
Hallo,

ich habe mal eine Frage zu den Umgebungsvariablen.
Normal kann man die ja mit GetEnvironmentVariable(Name) abfragen.
Aber in der Regel geht das nur für Name=TEMP oder TMP...eben jene, die in
Windows unter benutzerspezifischen Variablen angegeben sind.
Alternativ könnte man wohl auch MyRegIniFile.ReadString('Shell
Folders',RegIdent,'') rankommen, dazu muss man aber wieder in die Registry
was ich gern vermeiden würde.
Kommt man auch anders an den Ordner "Eigene Dateien" (der auf
anderssprachigen Betriebssystem ja auch wieder anders heißt...)?

Vielen Dank im Voraus.

Grüße,
F.F.
NineBerry Schwarz
2006-03-03 13:03:35 UTC
Permalink
Hallo
Post by Frank Fischer
Kommt man auch anders an den Ordner "Eigene Dateien" (der auf
anderssprachigen Betriebssystem ja auch wieder anders heißt...)?
//---------------------------------------------------------------------------
// Funktion GetMyFilesDirectory
// Gibt den Pfadnamen des Ordners "Eigene Dateien" zurück
//---------------------------------------------------------------------------
function GetMyFilesDirectory: string;
begin
Result := GetShellDirectoryEx(CSIDL_PERSONAL, 'Personal');
end;

//---------------------------------------------------------------------------
// Funktion GetShellDirectoryEx
// Gibt den Pfadnamen eines bestimmten Systemordners zurück
// Versucht zuerst, den Ordner anhand der CLSID zu ermitteln.
// Falls das nicht klappt, wird der Wert aus der Registry gelesen
//---------------------------------------------------------------------------
function GetShellDirectoryEx(ID: Integer; RegName: string): string;
var
Reg: TRegistry;
begin
Result:= GetShellDirectory(ID);

if Trim(Result) = '' then
begin
Reg:= TRegistry.Create;
try
Reg.RootKey:= HKEY_CURRENT_USER;
if Reg.OpenKey(REGSTR_PATH_SPECIAL_FOLDERS, False) then
begin
if Reg.ValueExists(RegName) then
Result:= Reg.ReadString(RegName);
end;
finally
Reg.Free;
end;
end;

if Trim(Result) = '' then
begin
Reg:= TRegistry.Create;
try
Reg.RootKey:= HKEY_LOCAL_MACHINE;
if Reg.OpenKey(REGSTR_PATH_SPECIAL_FOLDERS, False) then
begin
if Reg.ValueExists(RegName) then
Result:= Reg.ReadString(RegName);
end;
finally
Reg.Free;
end;
end;
end;


//---------------------------------------------------------------------------
// Funktion GetShellDirectory
// Gibt den Pfadnamen eines bestimmten Systemordners anhand der
// CLSID zurück
//---------------------------------------------------------------------------
function GetShellDirectory(ID: Integer): string;
var
S: string;
ItemIDList: PItemIDList;
SystemHeap: IMalloc;
begin
Result := EmptyStr;

if SHGetSpecialFolderLocation(Forms.Application.Handle, ID,
ItemIDList) = NOERROR then
begin
try
SetLength(S, MAX_PATH);
if SHGetPathFromIDList(ItemIDList, PChar(S)) then
begin
Result:= Copy(S, 1, Pos(#0, S) - 1);
end;
finally
// Von der Shell reservierten Speicher freigeben
if SHGetMalloc(SystemHeap) = NOERROR then
begin
SystemHeap.Free(ItemIDList);
end;
end;
end;
end;

Neun

Loading...