如何从Windows库的GUID获取PIDL?

时间:2015-07-17 16:15:21

标签: c++ windows guid

如何从GUID获取库的PIDL?

例如,如果我有文档库的GUID(“{7B0DB17D-9CD2-4A93-9733-46CC89022E7C}”),我该如何将其转换为库的ID列表?

我认为SHParseDisplayName会完成这项工作,但会返回“找不到文件。”

请记住,我需要的是库的PIDL,而不是其默认文件夹。

这是直接的C ++,没有.Net。

TIA

编辑:这是可以使用的代码,来自下面的响应(没有错误检查)。 guid是一个前缀为'shell :::'的GUID字符串,例如'shell ::: {7B0DB17D-9CD2-4A93-9733-46CC89022E7C}'。

IShellFolder* pDesktop;
LPITEMIDLIST pidl;
SHGetDesktopFolder(&pDesktop);
pDesktop->ParseDisplayName(nullptr, nullptr, guid, nullptr, &pidl, 0);

编辑2:更简单:如果'shell :::'被添加到前面,SHParseDisplayName有效:

SHParseDisplayName(guid, nullptr, &pidl, 0, nullptr); 

2 个答案:

答案 0 :(得分:2)

根据IShellFolder::ParseDisplayName的文档,如果您使用的是桌面文件夹,则只需在::{GUID}格式中传递一个文件名。

修改:文档似乎不完整,根据this answer您需要将shell:添加到字符串的开头。

p->ParseDisplayName(m_hWnd, NULL, _T("shell:::{7B0DB17D-9CD2-4A93-9733-46CC89022E7C}"), NULL, &pidl, NULL);

答案 1 :(得分:1)

您需要功能SHGetKnownFolderIDList

例如:

PIDLIST_ABSOLUTE pidl;
HRESULT hr = SHGetKnownFolderItem(FOLDERID_DocumentsLibrary, 0, NULL, out pidl);

Bonus Chatter

有三种shell函数可以处理KNOWNFOLDER