Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem mit ShellFolder -> CSIDL_APPDATA; CSIDL_LOCAL_AP (https://www.delphipraxis.net/51472-problem-mit-shellfolder-csidl_appdata%3B-csidl_local_ap.html)

FriFra 12. Aug 2005 23:05


Problem mit ShellFolder -> CSIDL_APPDATA; CSIDL_LOCAL_AP
 
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. :gruebel: :roll:

MathiasSimmack 12. Aug 2005 23:09

Re: Problem mit ShellFolder -> CSIDL_APPDATA; CSIDL_LOCAL
 
Das sollte bestimmt auch CSIDL_COMMON_APPDATA heißen?

FriFra 12. Aug 2005 23:25

Re: Problem mit ShellFolder -> CSIDL_APPDATA; CSIDL_LOCAL
 
Zitat:

Zitat von MathiasSimmack
Das sollte bestimmt auch CSIDL_COMMON_APPDATA heißen?

An CSIDL_COMMON_APPDATA hatte ich auch gedacht, diese Konstante ist in ShlObj aber garnicht deklariert :roll: ...

[EDIT]Ich habs gerade bie Luckie gefunden ;)
Delphi-Quellcode:
const
  CSIDL_COMMON_APPDATA = $0023;
:wall: :dancer:

Christian Seehase 12. Aug 2005 23:50

Re: Problem mit ShellFolder -> CSIDL_APPDATA; CSIDL_LOCAL
 
Moin FriFra,

Zitat:

Zitat von FriFra
...diese Konstante ist in ShlObj aber garnicht deklariert

Zitat:

Zitat von FriFra
Ich habs gerade bie Luckie gefunden

Dazu mal ein allgemeiner Tip:
Besorg' Dir mal das PSDK, inclusive der Headerdateien.

Dann kannst Du solche Daten direkt dort nachschlagen/suchen, wo sie definiert sein müssen (müssten ;-))


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz