C++ 所有著名的虚拟文件夹GUID都是什么?

C++ 所有著名的虚拟文件夹GUID都是什么?,c++,com,shell,windows-shell,C++,Com,Shell,Windows Shell,似乎有一些虚拟文件夹具有与其关联的GUID(控制面板、桌面)- :{00021400-0000-0000-c000-0000000000 46}//桌面 这些火焰的定义是什么?什么时候使用 我想要的是一种方法,让一个字符串代表一个虚拟文件夹,没有任何歧义 例如,如果我要为桌面创建一个PIDL,则显示名称返回为“C:\Users\Steve\desktop” 嗯,目前确实如此,但它并不是正确的文件夹。我可以在资源管理器中导航到该文件夹,它包含我桌面上的一部分文件,而不是整个桌面 我想要的是一种将该

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

:{00021400-0000-0000-c000-0000000000 46}//桌面

这些火焰的定义是什么?什么时候使用

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

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

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

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

有人知道这样的guid的最终列表吗?或者如何将给定的PIDL转换为一个PIDL

我尝试了SHGetDisplayName(pidl,SHGDN_*)-桌面pidl的每个版本都会给我一个简短的“桌面”或“C:\Users\Steve\desktop”。(很明显,我是通过“steve”帐户登录的)

想法/评论/建议

编辑:看来我可以使用下面给出的答案来列出已知的文件夹GUID。但有人知道如何通过编程从PIDL->已知文件夹GUID转换吗?我假设我可以解析DisplayName(“::{guid}”)来获取PIDL,但是有方法获取guid吗

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

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


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

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

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

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


有趣的问题。祝你好运处理vista/7()中的god mode文件夹有趣的链接。它对我一点影响都没有——但很有趣:)在Vista下运行,使用VS2008编译,并将我的exe标记为Vista感知(清单中的common controls 6.0),当我执行SHGetPathFromIDList()时,我没有得到GUID,而是得到了与SHParseDisplayName()相同的东西(即简单的字符串路径或文件夹名称,但从来没有GUID)您将只获取虚拟对象的GUID;“物理”对象仍将返回文件路径。但问题是:CSIDL_桌面既是虚拟文件夹又是真实文件夹。我还没有找到任何方法来诱使操作系统返回它的GUID——只有真正的文件夹(我不需要这个)CSIDL_DESKTOP是虚拟文件夹,而CSIDL_DESTOPDIRECTORY是真正的文件夹。不过,shell试图不给您GUID,这似乎是正确的。它似乎适用于某些虚拟文件夹;我得到了控制面板的“{20D04FE0-3AEA-1069-A2D8-08002B30309D}\:{21EC2020-3AEA-1069-A2DD-08002B30309D}”。我对shell的了解还不够,无法进一步帮助您。KnownFolderId与shell命名空间GUID不同。例如,FOLDERID_AddNewPrograms={de61d971-5ebc-4f02-a3a9-6c82895e5c04},但其底层Shell名称空间GUID是{15eae92e-f17a-4431-9f28-805e482dafd4}。控制面板的guid是(Vista和更高版本),但这并不是一个好主意。显然,他没有先检查msdn=/