如何从 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.
- 给定 KnownFolderID guid(例如 FOLDERID_DocumentsLibrary -
{7B0DB17D-9CD2-4A93-9733-46CC89022E7C}
)
- returns 你是那个 KNOWNFOLDER
的 absolute pidl
例如:
PIDLIST_ABSOLUTE pidl;
HRESULT hr = SHGetKnownFolderItem(FOLDERID_DocumentsLibrary, 0, NULL, out pidl);
奖金聊天
共有三个 shell 函数用于处理 KNOWNFOLDER
- SHGetKnownFolderPath : 获取已知文件夹的完整路径 (例如
C:\Users\Chris\Documents
)
- SHGetKnownFolderIDList: 获取已知文件夹的绝对pidl
- SHGetKnownFolderItem: 获取已知文件夹IShellItem
如何从库的 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.
- 给定 KnownFolderID guid(例如 FOLDERID_DocumentsLibrary -
{7B0DB17D-9CD2-4A93-9733-46CC89022E7C}
) - returns 你是那个 KNOWNFOLDER 的 absolute pidl
例如:
PIDLIST_ABSOLUTE pidl;
HRESULT hr = SHGetKnownFolderItem(FOLDERID_DocumentsLibrary, 0, NULL, out pidl);
奖金聊天
共有三个 shell 函数用于处理 KNOWNFOLDER
- SHGetKnownFolderPath : 获取已知文件夹的完整路径 (例如
C:\Users\Chris\Documents
) - SHGetKnownFolderIDList: 获取已知文件夹的绝对pidl
- SHGetKnownFolderItem: 获取已知文件夹IShellItem