对于 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
.
这里的这个链接似乎显示了一种方法。
似乎可以归结为这一点(谨慎对待,我不太了解 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;
此页面提供了所有CSIDL_*
和FOLDERID_*
值的列表。请记住,您也应该将这些函数用于特定于用户的数据,而不是像"C:\Documents and Settings\<CurrentUser>\Application Data\"
. 可能是不同语言版本的 Windows 使用不同的目录名称,或者用户可以自由移动他们的数据区域。