在 Windows 上保存 ini 文件的位置取决于机器(而不是用户)

2024-01-07

我的应用程序当前正在将设置存储在当前用户配置文件下的 INI 文件中(C:\Documents and Settings\<CurrentUser>\Application Data\MyApplication\MySettings.ini在 WinXP 下)。但我意识到其中一些设置对于机器而不是用户来说是唯一的,因此希望(实际上需要)将它们保存在所有用户的单个位置。

Windows XP(及更高版本)上是否有可以存储用户独立设置的文件夹位置?

NOTE:我不想将它们存储在与我的应用程序相同的文件夹中,也不想将它们存储在注册表中。

我注意到“C:\Documents and Settings\”下有一个“All Users”文件夹?我应该存放在那里吗?

奖励积分:我更有可能将答案授予能够告诉我如何在 Delphi 7 中从 Windows 返回此路径的人。


对于 XP,Windows 提供SHGetFolderPath() http://msdn.microsoft.com/en-us/library/bb762181%28VS.85%29.aspx获取已知位置。您正在寻找的 CSIDL 是CSIDL_COMMON_APPDATA, 被形容为:

包含所有用户的应用程序数据的文件系统目录。典型的路径是"C:\Documents and Settings\All Users\Application Data"。此文件夹用于存储非用户特定的应用程序数据。例如,应用程序可以将拼写检查词典、剪贴画数据库或日志文件存储在CSIDL_COMMON_APPDATA文件夹。此信息不会漫游,任何使用该计算机的人都可以使用该信息。

对于 Vista 及更高版本,这已被替换为SHGetKnownFolderPath() http://msdn.microsoft.com/en-us/library/bb762188%28VS.85%29.aspx尽管 SHGetFolderPath() 仍然可用作其包装函数。如果您使用真正的 Vista 调用,您应该使用FOLDERID_ProgramData代替CSIDL_COMMON_APPDATA.

这个链接here http://coding.derkeiler.com/Archive/Delphi/alt.comp.lang.borland-delphi/2007-02/msg00166.html似乎展示了一种做到这一点的方法。

似乎可以归结为这一点(谨慎对待这一点,我不太了解 Delphi):

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;

这一页 http://msdn.microsoft.com/en-us/library/bb762494%28VS.85%29.aspx提供了所有的列表CSIDL_* and FOLDERID_*价值观。请记住,您也应该将这些函数用于特定于用户的数据,而不是硬编码值,例如"C:\Documents and Settings\<CurrentUser>\Application Data\"。不同语言版本的 Windows 可能使用不同的目录名称,或者用户可以自由移动其数据区域。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Windows 上保存 ini 文件的位置取决于机器(而不是用户) 的相关文章

随机推荐