2009-08-11 4 views
5

speichern Meine Anwendung speichert derzeit Einstellungen in einer INI-Datei unter dem aktuellen Benutzerprofil (C:\Documents and Settings\<CurrentUser>\Application Data\MyApplication\MySettings.ini unter WinXP). Aber ich habe festgestellt, dass einige dieser Einstellungen für die Maschine und nicht für den Benutzer einzigartig sind und sie daher (eigentlich) für alle Benutzer an einem einzigen Ort speichern sollen.Wo ini-Datei abhängig von Maschine (nicht Benutzer) auf Windows

Gibt es unter Windows XP (und höher) einen Ordner, in dem ich benutzerunabhängige Einstellungen speichern kann?

HINWEIS: Ich möchte sie nicht im selben Ordner wie meine Anwendung speichern, noch möchte ich sie in der Registrierung speichern.

Ich bemerke, dass es einen Ordner "Alle Benutzer" unter "C: \ Dokumente und Einstellungen \" gibt? Soll ich dort unterbringen?

Bonuspunkte: Ich bin eher die Antwort auf wer auch immer zu vergeben mir auch sagen kann, wie diesen Weg in Delphi von Windows zurückzukehren 7.

Antwort

12

Für XP bietet Windows SHGetFolderPath() einen bekannten Standort erhalten . Die CSIDL, die Sie suchen ist CSIDL_COMMON_APPDATA, wie folgt beschrieben:

Das Dateisystemverzeichnis, das Anwendungsdaten für alle Benutzer enthält. Ein typischer Pfad ist "C:\Documents and Settings\All Users\Application Data". Dieser Ordner wird für Anwendungsdaten verwendet, die nicht benutzerspezifisch sind. Eine Anwendung kann z. B. ein Rechtschreibwörterbuch, eine Clip-Art-Datenbank oder eine Protokolldatei im Ordner CSIDL_COMMON_APPDATA speichern. Diese Information wird nicht roamen und steht jedem zur Verfügung, der den Computer benutzt.

für Vista und später, dies mit SHGetKnownFolderPath() ersetzt wurde, obwohl SHGetFolderPath() für das immer noch als eine Wrapper-Funktion ist. Wenn Sie den echten Vista-Anruf verwenden, sollten Sie FOLDERID_ProgramData statt CSIDL_COMMON_APPDATA verwenden.

Dieser Link here scheint einen Weg zu zeigen, dies zu tun.

Es scheint, dies zu einkochen (behandeln diese mit Umsicht, weiß ich nicht, Delphi, die 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; 

This page stellt eine Liste aller CSIDL_* und FOLDERID_* Werte. Beachten Sie, dass Sie diese Funktionen auch für Ihre benutzerspezifischen Daten verwenden sollten, nicht fest codierte 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.

+4

Dies ist die richtige API zu verwenden, und die richtige folderid in dieser Situation zu fragen. Es gibt jedoch noch eine Sache, die geklärt werden muss: - Dateien, die an diesem Speicherort erstellt werden, sind RW an Administratoren und Eigentümer, aber R an andere Benutzer. Ist es wichtig, dass jeder _user_ (d. H. Kein erweiterter UAC-Benutzer oder Benutzer) in die ini-Datei schreiben kann? Wenn dies der Fall ist, muss nach der Erstellung die Zugriffssteuerungsliste der Datei oder des Ordners so angepasst werden, dass sie einen expliziten RW-Eintrag für alle Benutzer enthält. –

+0

Autsch! Danke für die Heads up Chris ... wie mache ich das? Oder gibt es einen besseren Standort, der diese Einschränkung nicht hat? – CodeAndCats

+0

Nein, das ist der beste Standort. Wenn Sie möchten, dass die Benutzer die Einstellungen bearbeiten, müssen Sie ein Überschreibungssystem erstellen. Standardeinstellungen und allgemeine Einstellungen befinden sich im Ordner "Alle Benutzer" und benutzerspezifisch im entsprechenden Verwendungsprofil. Auf diese Weise haben Sie globale schreibgeschützte Einstellungen, die Benutzer mit ihren eigenen überschreiben können. Auf diese Weise ändern sie sich nicht gegenseitig ihre Einstellungen. – Runner

6

Ich würde die Open Source JEDI Code Library für diese Art von Sache empfehlen.

In JclShell.pas finden Sie, GetSpecialFolderLocation()

YourDataFolder := GetSpecialFolderLocation(CSIDL_COMMON_APPDATA); 

Es ist kostenlos, gut getestet, arbeiten mit allen Windows-Versionen und deren Verwendung werden Sie von zukünftigen Änderungen an dem Windows-API isolieren.

+1

Ich habe gerade Probleme damit. In meinem Fall wollte ich den Ordner "Gemeinsame Dokumente" abrufen und ich habe JclSysInfo.GetCommonDocumentsFolder verwendet (das GetSpecialFolderLocation verwendet und SHGetSpecialFolderLocation aufruft). In mehreren WinXP-Umgebungen, in denen 'Gemeinsame Dokumente' durch Einstellungen ausgeblendet sind, schlägt SHGetSpecialFolderLocation immer fehl, aber SHGetFolderPath funktioniert. Also muss ich JclSysInfo beenden ... – benok

+0

"'Freigegebene Dokumente' ist von 'Arbeitsplatz' ausgeblendet" ist korrekt. Es tut uns leid. – benok

Verwandte Themen