我在大型大学的一位用户(我想,大学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'。
答案 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
状态代码的含义。