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

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

本文关键字:获取 PIDL GUID 库的 Windows      更新时间:2023-10-16

如何从库的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:更容易:SHParseDisplayName工作,如果'shell:::'是前置:

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

根据IShellFolder::ParseDisplayName的文档,如果您正在使用桌面文件夹,您可以简单地通过::{GUID}形式的文件名。

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

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

您想要的函数SHGetKnownFolderIDList

  • 给定一个KnownFolderID guid(例如 folderid_documentlibrary - {7B0DB17D-9CD2-4A93-9733-46CC89022E7C})
  • 返回该KNOWNFOLDER的绝对文件夹
例如:

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

奖金喋喋不休

有三个shell函数用于处理KNOWNFOLDERs

  • SHGetKnownFolderPath:获取已知文件夹的完整路径(例如:C:UsersChrisDocuments)
  • SHGetKnownFolderIDList:获取已知文件夹的绝对pidl
  • SHGetKnownFolderItem:获取已知文件夹
  • IShellItem