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.
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. –
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
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