12

似乎有一些虚拟文件夹具有与之关联的 GUID(控制面板、桌面)-

::{00021400-0000-0000-c000-000000000046} // 桌面

这些大火是在哪里定义的?它们什么时候使用?

我想要的是一种方法,让字符串代表一个虚拟文件夹,没有任何歧义。

例如,如果我要为桌面创建一个 PIDL,则显示名称将返回为“C:\Users\Steve\Desktop”。

好吧,目前确实如此 - 但它并不是真正正确的文件夹。我可以在资源管理器中导航到该文件夹​​,它包含我桌面上的部分文件,而不是整个桌面。

我想要的是一种将该位置编码为字符串的方法,该字符串将始终导航到虚拟桌面文件夹(具有其所有内容的文件夹,而不仅仅是一些内容)。

有谁知道此类 GUID 的最终列表?或者我如何将给定的 PIDL 转换为一个?

我尝试了 SHGetDisplayName(pidl, SHGDN_*) - 桌面 pidl 的每个版本都给了我一个简短的“桌面”或“C:\Users\Steve\Desktop”。(显然,我是在“史蒂夫”帐户下登录的)。

想法/评论/指针?

编辑:所以看来我可以使用下面给出的答案来获得已知文件夹 GUId 的列表。但是有谁知道如何以编程方式从 PIDL -> 已知文件夹 GUID 转换?我假设我可以 ParseDisplayName("::{guid}") 获取 PIDL,但是有没有办法获取 GUID?

EDIT2:我仍然找不到以编程方式访问 GUID 的方法。但是,出于我的目的,我正在记录最初用于创建对象的 CSIDL_xxx,然后将其写出并在稍后恢复它,然后通过 CSIDL 创建一个 PIDL,它保留其正确的身份(即它不不会降级为“C:\Users\\Desktop”,而是生成一个真正指向虚拟桌面的 PIDL。

对我来说,诀窍是始终使用 CSIDL->PIDL,从不使用介于两者之间的字符串。CSIDL->PIDL->string->PIDL = 退化为非虚拟路径。

感谢大家的帮助-如果有人找到有关该主题的更多信息并将其发布,我将继续寻找,我会很感兴趣!;)

4

2 回答 2

5

如果我理解正确,您正在寻找CSIDL(Vista 之前,包括 Shlobj.h)或KNOWNFOLDERID(>= Vista,Knownfolders.h)。

于 2010-01-21T19:37:36.273 回答
1

我认为这些 GUID 没有正式记录。您可以使用 SHGetPathFromIDList() 来获取 GUID。它会指示失败,但如果您查看 pszPath 参数,您会看到它填充了一个 GUID(但是,第一个字符设置为 NULL)。除此之外,您还可以找到其他人发现的各种 GUIDS 列表。

编辑:我发现了一些有趣的链接;看来您可以通过搜索注册表来发现这些 GUID。

一个关于 shell GUID 的论坛帖子

控制面板 GUID

如何安装 shell 命名空间

于 2010-01-21T19:56:24.610 回答