在windows上保存依赖于机器(不是用户)的ini文件的位置

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

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

注意:我不想将它们存储在与我的应用程序相同的文件夹中,也不希望将它们存储在registry中。

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

奖励积分:我更倾向于给予谁可以告诉我如何在Delphi 7中从Windows返回这个path的答案。

对于XP,Windows提供了SHGetFolderPath()来获取已知位置。 您要查找的CSIDL是CSIDL_COMMON_APPDATA ,描述如下:

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

对于Vista和更高版本,这已被替换为SHGetKnownFolderPath(),尽管SHGetFolderPath()仍然可用作包装函数。 如果您使用真正的Vista调用,则应该使用FOLDERID_ProgramData而不是CSIDL_COMMON_APPDATA

这里的链接似乎表明了一种做法。

这似乎归结于此(谨慎对待此事,我不知道德尔福那么好):

 function ShGetKnownFolderPath ( const rfid: TGUID; dwFlags: DWord; hToken: THandle; out ppszPath: PWideChar): HResult; var Shell: Hmodulee; 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; 

此页面提供了所有CSIDL_*FOLDERID_*值的列表。 请记住,您应该将这些函数用于您的用户特定数据,而不是硬编码的值,如"C:\Documents and Settings\<CurrentUser>\Application Data\" 。 Windows的不同语言版本可能使用不同的目录名称,或者用户可以自由移动数据区域。

我建议使用开源的JEDI代码库来处理这种事情。

在JclShell.pas中,你会发现GetSpecialFolderLocation()

 YourDataFolder := GetSpecialFolderLocation(CSIDL_COMMON_APPDATA); 

它是免费的,经过充分测试,适用于所有的Windows版本,使用它将使您免受未来对Windows API的影响。