2

我在一所大型大学的一个用户(我想,大学 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

编辑:

弄清楚这个 API 让我觉得自己在追赶我的尾巴——我绕着圈子试图找到正确的调用。据说这种方法和其他类似方法已被 Microsoft 弃用(以及该问题的早期发布者(@TLama?),后来删除了该帖子。)但是,似乎我们大多数人,包括我,经常并安全地忽略该状态。

在我的搜索中,我从前一段时间在 SO 上找到了一个很好的答案,包括不推荐使用的示例代码什么导致了这个错误 'Unable to write to application file.ini'

4

1 回答 1

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状态代码的内容即可。

于 2013-01-26T18:15:32.350 回答