Problem mit ShellFolder -> CSIDL_APPDATA und CSIDL_LOCAL_AP liefern beide nur den Anwendungsdaten-Ordner des angemeldeten Users...
Ich verwende folgende Funktion (ist eigentlich von Luckie
);
Delphi-Quellcode:
function GetShellFolder(CSIDL: integer): string;
var
pidl: PItemIdList;
FolderPath: string;
SystemFolder: Integer;
begin
SystemFolder := CSIDL;
if SUCCEEDED(SHGetSpecialFolderLocation(0, SystemFolder, pidl)) then
begin
SetLength(FolderPath, max_path);
if SHGetPathFromIDList(pidl, PChar(FolderPath)) then
begin
SetLength(FolderPath, strlen(PChar(FolderPath)));
end;
end;
Result := FolderPath;
end;
BEIDE Aufrufe, liefern mir den lokalen Application Pfad:
Delphi-Quellcode:
GetShellFolder(shlobj.CSIDL_APPDATA);
GetShellFolder(shlobj.CSIDL_LOCAL_APPDATA);
Momentan habe ich folgenden Workaround:
Delphi-Quellcode:
...
function GetUser: string;
var
Buffer: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char;
Size: DWord;
begin
Size := Pred(SizeOf(Buffer));
Windows.GetUserName(Buffer, Size);
Result := StrPas(Buffer);
end;
begin
Result := GetShellFolder(CSIDL_APPDATA);
Result := StringReplace(Result, '\' + GetUser + '\', '\All Users\', []);
...
Ich wüsse allerdings schon ganz gern, wo der eigentliche Fehler ist... Ich kann mir kaum vorstellen, dass hier die
API selbst fehlerhaft ist, dann wohl eher die entspr. Kapselung in Delphi.
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.