Поиск правильного CLSID для панели управления
Я пытаюсь фильтровать
IShellFolder::EnumObjects
результат, следуя инструкциям от этот[^] вопрос.Хотя ссылки из самого высокого проголосованного ответа недействительны, я смог найти их и применить код г-на Чэня в своем собственном коде. Для корзины все работало нормально, она была отфильтрована, но Панель управления осталась.
Ниже приведен пример кода с соответствующими комментариями. Все, что я изменил, было постоянным.
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; }
СООТВЕТСТВУЮЩАЯ ИНФОРМАЦИЯ:
Я поддерживаю Windows 8 и далее, используя VS 2019. Для получения дополнительной информации оставьте комментарий.
ВОПРОС:
Как сделать так, чтобы вышеприведенное сравнение CLSID работало? Где находится правильная константа CLSID?
Что я уже пробовал:
Проходя через отладчик, я увидел, что
CLSID_ControlPanel
иметь значение {21EC2020-3AEA-1069-A2DD-08002B30309D}
но возвращает код {26EE0668-A00A-44D7-9371-BEB064C98683}
, который является, почему сравнение не удается.У меня есть F12ред
CLSID_RecycleBin
надеясь найти правильную константу для Панели управления, но не повезло.Я тоже посмотрел здесь[^], но опять не имел успеха.
Я нашел ... эта ссылка[^] но пока не вижу, как эта информация мне поможет.
В настоящее время я прохожу через это так вопрос[^] как это кажется уместным...
Richard MacCutchan
Если вы посмотрите на HKEY_CLASSES_ROOT/CLSID
записи в реестре вы увидите, что оба этих ключа относятся к панели управления. Где находится определение для CLSID_ControlPanel, которое вы используете?
RLebeau
CLSID_ControlPanel определен в shlguid.h, но есть 3 других CLSID, связанных с ControlPanel, которые не определены в заголовках Win32 SDK:
{21EC2020-3AEA-1069-A2DD-08002B30309D} = CLSID_ControlPanel
{5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0} = CLSID_ControlPanelRecent
{ED7BA470-8E54-465E-825C-99712043E01C} = CLSID_ControlPanelTasks
{26EE0668-A00A-44D7-9371-BEB064C98683} = CLSID_ControlPanelCategory