【发布时间】:2014-03-30 03:11:40
【问题描述】:
我的软件仍然需要支持 Windows XP。其中,我从 Windows 服务调用SHGetKnownFolderPath API 以通过hToken 获取用户特定的路径(例如FOLDERID_Desktop)。由于 XP 不支持该 API,我很好奇是否有其他方法可以在该操作系统上执行此操作?
【问题讨论】:
标签: c++ c winapi windows-xp known-folders
我的软件仍然需要支持 Windows XP。其中,我从 Windows 服务调用SHGetKnownFolderPath API 以通过hToken 获取用户特定的路径(例如FOLDERID_Desktop)。由于 XP 不支持该 API,我很好奇是否有其他方法可以在该操作系统上执行此操作?
【问题讨论】:
标签: c++ c winapi windows-xp known-folders
正确使用的函数是SHGetFolderLocation,传递NULL 或-1 作为访问令牌:
hToken [in]
类型:句柄
可用于代表特定用户的访问令牌。它通常设置为 NULL,但当有 被视为属于某个文件夹的那些文件夹的多个用户 单用户。这种类型最常用的文件夹是我的 文件。调用应用程序负责正确 hToken 为非 NULL 时的模拟。它必须有适当的 特定用户的安全权限,以及用户的注册表 当前必须安装配置单元。请参阅访问控制了解更多信息 讨论访问控制问题。
为 hToken 参数赋值 -1 表示默认用户。这允许 SHGetFolderLocation 的客户端找到文件夹 默认用户的位置(例如桌面文件夹)。这 当任何新用户帐户被复制时,默认用户用户配置文件被复制 已创建,并包括特殊文件夹,例如我的文档和 桌面。添加到默认用户文件夹的任何项目也出现在任何 新用户帐户。
【讨论】:
SHGetFolderPath 它的双 API 会更好地作为返回实际文件夹路径的 API。再次感谢!
SHGetFolderLocation() 返回一个 PIDL,您可以使用 SHGetPathFromIDList() 将其转换为路径。
SHGetFolderPath()(和SHGetSpecialFolderPath())在首次引入 PIDL 时不存在,后来添加。因此,这完全取决于您需要多远才能支持较旧的操作系统版本。如果您必须比 Win2K 更进一步,那么您可以使用 GetProcAddress() 加载 SHGetFolderPath(),如果它不可用,则提供您自己的使用 SHGetFolderLocation() 和 SHGetPathFromIDList() 的包装器。