对于 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 可能使用不同的目录名称,或者用户可以自由移动其数据区域。