【问题标题】:Any alternatives to SHGetKnownFolderPath with user token for Windows XP?使用 Windows XP 的用户令牌可以替代 SHGetKnownFolderPath 吗?
【发布时间】:2014-03-30 03:11:40
【问题描述】:

我的软件仍然需要支持 Windows XP。其中,我从 Windows 服务调用SHGetKnownFolderPath API 以通过hToken 获取用户特定的路径(例如FOLDERID_Desktop)。由于 XP 不支持该 API,我很好奇是否有其他方法可以在该操作系统上执行此操作?

【问题讨论】:

    标签: c++ c winapi windows-xp known-folders


    【解决方案1】:

    正确使用的函数是SHGetFolderLocation,传递NULL-1 作为访问令牌:

    hToken [in]

    类型:句柄

    可用于代表特定用户的访问令牌。它通常设置为 NULL,但当有 被视为属于某个文件夹的那些文件夹的多个用户 单用户。这种类型最常用的文件夹是我的 文件。调用应用程序负责正确 hToken 为非 NULL 时的模拟。它必须有适当的 特定用户的安全权限,以及用户的注册表 当前必须安装配置单元。请参阅访问控制了解更多信息 讨论访问控制问题。

    为 hToken 参数赋值 -1 表示默认用户。这允许 SHGetFolderLocation 的客户端找到文件夹 默认用户的位置(例如桌面文件夹)。这 当任何新用户帐户被复制时,默认用户用户配置文件被复制 已创建,并包括特殊文件夹,例如我的文档和 桌面。添加到默认用户文件夹的任何项目也出现在任何 新用户帐户。

    【讨论】:

    • 非常好的发现。欣赏它!但在我的情况下,SHGetFolderPath 它的双 API 会更好地作为返回实际文件夹路径的 API。再次感谢!
    • SHGetFolderLocation() 返回一个 PIDL,您可以使用 SHGetPathFromIDList() 将其转换为路径。
    • @RemyLebeau:是的,我知道。但是,当我可以使用一个 API 时,为什么还要使用两个 API。 (在我的情况下,我只需要它作为桌面路径。)
    • @ahmd0: SHGetFolderPath()(和SHGetSpecialFolderPath())在首次引入 PIDL 时不存在,后来添加。因此,这完全取决于您需要多远才能支持较旧的操作系统版本。如果您必须比 Win2K 更进一步,那么您可以使用 GetProcAddress() 加载 SHGetFolderPath(),如果它不可用,则提供您自己的使用 SHGetFolderLocation()SHGetPathFromIDList() 的包装器。
    • @ahmd0:我的所有开发虚拟机仍然使用 XP :) 相当轻量级,无需处理 UAC 牛****,等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2015-05-09
    • 2019-08-10
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多