我在大型大学的一个用户(我想,大学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".
如果您想了解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状态代码的含义.
| 归档时间: |
|
| 查看次数: |
860 次 |
| 最近记录: |