如何从 Windows 库的 GUID 获取 PIDL?

How to get a PIDL from a Windows library's GUID?

如何从库的 GUID 获取库的 PIDL?

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

我以为 SHParseDisplayName 可以胜任,但是 returns "file not found."

请记住,我需要的是库的 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); 

根据 IShellFolder::ParseDisplayName 的文档,如果您使用的是桌面文件夹,您只需将文件名以 ::{GUID} 的形式传递给它即可。

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

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

您需要函数 SHGetKnownFolderIDList.

例如:

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

奖金聊天

共有三个 shell 函数用于处理 KNOWNFOLDER