什么是众所周知的虚拟文件夹GUID?

时间:2010-01-21 19:27:18

标签: c++ com shell windows-shell

似乎有一些虚拟文件夹与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 =退化为非虚拟路径。

感谢大家的帮助 - 我会一直在寻找是否有人发现更多关于这个主题并发布它,我会感兴趣的! ;)

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

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

A forum posting about shell GUIDs

Control Panel GUIDs

How shell namespaces are installed