Frage

Meine Anwendung speichert derzeit Einstellungen in einer INI -Datei unter dem aktuellen Benutzerprofil (Profil des aktuellen Benutzers ( C:\Documents and Settings\<CurrentUser>\Application Data\MyApplication\MySettings.ini unter winxp). Ich habe jedoch festgestellt, dass einige dieser Einstellungen für die Maschine, nicht den Benutzer, einzigartig sind und daher möchten (tatsächlich brauchen), um sie an einem einzigen Ort für alle Benutzer zu speichern.

Gibt es einen Ordnerspeicherort unter Windows XP (und UP), an dem ich benutzerunabhängige Einstellungen speichern kann?

HINWEIS: Ich möchte sie weder im selben Ordner wie meine Bewerbung speichern noch in der Registrierung speichern.

Ich bemerke, dass es einen "alle Benutzer" -Fordner unter "C: Dokumenten und Einstellungen " gibt? Soll ich dort unter speichern?

Bonuspunkte: Es wird mir eher die Antwort an denjenigen vergeben, der mir auch sagen kann, wie ich diesen Weg in Delphi 7 von Windows zurückgibt.

War es hilfreich?

Lösung

Für XP bietet Windows ShgetFolderPath () um einen bekannten Ort zu bekommen. Das CSIDL, das Sie suchen, ist CSIDL_COMMON_APPDATA, beschrieben als:

Das Dateisystemverzeichnis, das Anwendungsdaten für alle Benutzer enthält. Ein typischer Weg ist "C:\Documents and Settings\All Users\Application Data". Dieser Ordner wird für Anwendungsdaten verwendet, die nicht benutzerspezifisch sind. Beispielsweise kann eine Anwendung ein Zauberprüfungswörterbuch, eine Datenbank mit Clip-Kunst oder eine Protokolldatei in der CSIDL_COMMON_APPDATA Mappe. Diese Informationen werden nicht durchlaufen und stehen jedem, der den Computer benutzt, zur Verfügung.

Für Vista und später wurde dies durch ersetzt Shget bekannte folderpath () Obwohl shgetFolderPath () immer noch als Wrapper -Funktion dafür verfügbar ist. Wenn Sie den echten Vista -Anruf verwenden, sollten Sie verwenden FOLDERID_ProgramData Anstatt von CSIDL_COMMON_APPDATA.

Dieser Link hier Scheint eine Art zu zeigen, wie man es tun kann.

Es scheint darauf zurückzuführen (behandeln Sie dies mit Umsicht, ich kenne Delphi nicht so gut):

function ShGetKnownFolderPath (
    const rfid:   TGUID;
    dwFlags:      DWord;
    hToken:       THandle;
    out ppszPath: PWideChar): HResult;
var
    Shell: HModule;
    Fn: TShGetKnownFolderPath;
begin
    Shell := LoadLibrary ('shell32.dll');
    Win32Check(Shell <> 0);
    try
        @Fn := GetProcAddress (Shell, 'SHGetKnownFolderPath');
        Win32Check (Assigned (Fn));
        Result := Fn (rfid, dwFlags, hToken, ppszPath);
    finally
        FreeLibrary (Shell);
    end;
end;

 

function GetKnownFolderPath (
    const rfid: TGUID;
    dwFlags:    DWord;
    hToken:     THandle): WideString;
var
    buffer: PWideChar;
    ret: HResult;
begin
    ret :=ShGetKnownFolderPath (rfid, dwFlags, hToken, buffer);
    OleCheck (ret);
    try
        Result := buffer;
    finally
        CoTaskMemFree (buffer);
    end;
end;

Diese Seite Bietet eine Liste aller CSIDL_* und FOLDERID_* Werte. Denken Sie daran, dass Sie diese Funktionen auch für Ihre benutzerspezifischen Daten verwenden sollten, nicht für hartcodierte Werte wie "C:\Documents and Settings\<CurrentUser>\Application Data\". Es kann sein, dass verschiedene Sprachversionen von Windows unterschiedliche Verzeichnisnamen verwenden oder dass Benutzer ihre Datenbereiche frei verschieben können.

Andere Tipps

Ich würde empfehlen, die Open Source zu verwenden Jedi -Code -Bibliothek für so etwas.

In jclshell.pas finden Sie GetSpecialFolderLocation ()

YourDataFolder := GetSpecialFolderLocation(CSIDL_COMMON_APPDATA);

Es ist kostenlos, gut getestet, funktioniert mit allen Windows -Versionen und isoliert Sie von zukünftigen Änderungen bis zur Windows -API.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top