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

时间:2013-01-26 18:06:18

标签: 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

编辑:

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

在我的搜索中,我在一段时间之前就在SO上找到了一个很好的答案,包括 - 不赞成这样做的示例代码:what causes this error 'Unable to write to application file.ini'

1 个答案:

答案 0 :(得分:7)

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

您需要根据自己的优点对待每个功能。阅读MSDN上的文档。对于SHGetSpecialFolderLocation,返回值为HRESULT。对于SHGetPathFromIDList,您可以获得BOOL。如果是FALSE则呼叫失败。

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

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

  

<强> CSIDL_COMMON_APPDATA

     

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

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