【发布时间】:2020-11-19 05:03:21
【问题描述】:
我正在尝试按照this question 中的说明过滤 IShellFolder::EnumObjects 结果。
虽然来自最高投票答案的链接无效,但我能够找到它们并自己应用陈先生的代码。回收站一切正常,它被过滤掉了,但控制面板仍然存在。
以下是示例代码,以及相关的 cmets。我所做的只是将常量CLSID_RecycleBin 更改为CLSID_ControlPanel,其他一切都一样。
HRESULT CShellTree::EnumObjects(HTREEITEM hParentItem, LPSHELLFOLDER pParentFolder, LPITEMIDLIST pidlParent)
{
LPENUMIDLIST pEnum = NULL;
HRESULT hr = pParentFolder->EnumObjects(NULL, m_dwFlags, &pEnum);
if (FAILED(hr) || pEnum == NULL)
{
return hr;
}
LPITEMIDLIST pidlTemp;
DWORD dwFetched = 1;
LPAFX_SHELLITEMINFO pItem;
while (SUCCEEDED(pEnum->Next(1, &pidlTemp, &dwFetched)) && dwFetched)
{
IShellFolder* psf;
LPCITEMIDLIST pidlChild;
bool skip = false;
hr = SHBindToParent(pidlTemp, IID_IShellFolder, (void**)&psf, &pidlChild);
if (SUCCEEDED(hr))
{
SHDESCRIPTIONID pdid;
hr = SHGetDataFromIDList(psf, pidlChild, SHGDFIL_DESCRIPTIONID, &pdid, sizeof(pdid));
psf->Release();
if (SUCCEEDED(hr))
{
// below comparison fails, but it works for CLSID_RecycleBin
// when going through Debugger, pdid.clsid is {26EE0668-A00A-44D7-9371-BEB064C98683}
// CLSID_ControlPanel is {21EC2020-3AEA-1069-A2DD-08002B30309D}
skip = pdid.clsid == CLSID_ControlPanel;
}
}
if (skip)
continue;
// insert TreeView item, omitted for brevity
}
return hr;
}
通过调试器,我看到CLSID_ControlPanel 的值是{21EC2020-3AEA-1069-A2DD-08002B30309D},但代码返回{26EE0668-A00A-44D7-9371-BEB064C98683},这就是比较失败的原因。
我有 F12ed CLSID_RecycleBin 希望为控制面板找到正确的常量,但没有运气。
我也看过here,但还是没有成功。
我找到了this link,但还不知道这些信息对我有什么帮助。
我目前正在通过this SO question 似乎相关...
相关信息:
我正在使用 VS 2019 支持 Windows 8 及更高版本。有关更多信息,请发表评论。
问题:
如何进行上述 CLSID 比较?正确的 CLSID 常量在哪里?
【问题讨论】:
-
"来自最高投票答案的链接无效" - 我已更新链接
-
唯一记录的一个是 {21EC2020-3AEA-1069-A2DD-08002B30309D} (CLSID_ControlPanel)。 {26EE0668-A00A-44D7-9371-BEB064C98683} 是 CLSID_ControlPanelCategory (magnumdb.com/…)