为什么COMMON_APPDATA在Windows XP上作为空字符串返回

Rob*_*ank 2 delphi winapi

我在大型大学的一个用户(我想,大学IT部门一般在他们的计算机上具有积极的安全设置)正在获取Windows XP为CSIDL_COMMON_APPDATA或CSIDL_PERSONAL返回的空字符串.(我不确定其中哪一个返回空字符串,因为我还没有检查他的电脑,看看他是如何安装软件的,但我很确定它是COMMON_APPDATA ...)

有没有人遇到这个或有关于如何处理这个的建议?

这是我用来检索值的Delphi代码:

Function GetSpecialFolder( FolderID: Integer):String;
var
  PIDL: PItemIDList;
  Path: array[0..MAX_PATH] of Char;
begin
  SHGetSpecialFolderLocation(Application.Handle, FolderID, PIDL);
  SHGetPathFromIDList(PIDL, Path);
  Result := Path;
end;  { GetSpecialFolder }

ShowMessage(GetSpecialFolder(CSIDL_COMMON_APPDATA));  <--- This is an empty string
Run Code Online (Sandbox Code Playgroud)

编辑:

弄清楚这个API让我觉得我正在追逐我的尾巴 - 我试图寻找合适的电话.据说这种方法和其它类似的方法被微软推荐(以及此问题的早期海报(@TLama?)后来删除了帖子.)但是,我们大多数人,包括我,似乎经常并安全地忽略该状态.

在我的搜索中,我在一段时间之前在SO上找到了一个很好的答案,包括弃用的方法的示例代码:导致此错误的原因是"无法写入应用程序file.ini".

Dav*_*nan 7

如果您想了解API调用失败的原因,您需要检查返回值.这就是这段代码中缺少的东西.

你需要根据自己的优点对待每个函数.阅读MSDN上的文档.在这种情况下SHGetSpecialFolderLocation,返回值是HRESULT.因为SHGetPathFromIDList你回来了BOOL.如果那样FALSE则呼叫失败.

这里可能的罪魁祸首是SHGetSpecialFolderLocation接收CSIDL的代码,但是每当调用Windows API函数时都必须检查错误.

看一下CSIDL我们看到的文档:

CSIDL_COMMON_APPDATA

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

如果计算机的shell版本低于5.0,CSIDL则不支持此值.这是该CSIDL值唯一记录的故障模式.我认为这不适用于您的情况,因此您只需要查看HRESULT状态代码的含义.