MyOldAccount Ответов: 1

Поиск правильного 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

1 Ответов

Рейтинг:
11

RLebeau

Согласно реестру, {26EE0668-A00A-44D7-9371-BEB064C98683} это для "Панели управления", тогда как {21EC2020-3AEA-1069-A2DD-08002B30309D} это для "всех элементов панели управления".

См. HKEY_CLASSES_ROOT\CLSID\{26EE0668-A00A-44D7-9371-BEB064C98683} и HKEY_CLASSES_ROOT\CLSID\{21EC2020-3AEA-1069-A2DD-08002B30309D} ключи.

Согласно с Полный список ярлыков Windows 10 CLSID Key (GUID) :

Control Panel                           {5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0}
Control Panel (All Tasks)               {ED7BA470-8E54-465E-825C-99712043E01C}
Control Panel (always Category view)    {26EE0668-A00A-44D7-9371-BEB064C98683}
Control Panel (always Icons view)       {21EC2020-3AEA-1069-A2DD-08002B30309D}


То же самое с Список ярлыков CLSID key (GUID) для Windows 7:

Control Panel                   {5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0}
Control Panel (All Tasks)       {ED7BA470-8E54-465E-825C-99712043E01C}
Control Panel (Category view)   {26EE0668-A00A-44D7-9371-BEB064C98683}
Control Panel (Icons view)      {21EC2020-3AEA-1069-A2DD-08002B30309D}


Согласно База Данных Магических Чисел, эти CLSIDs помечены следующим образом:

{5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0} = CLSID_ControlPanelRecent
{ED7BA470-8E54-465E-825C-99712043E01C} = CLSID_ControlPanelTasks
{26EE0668-A00A-44D7-9371-BEB064C98683} = CLSID_ControlPanelCategory
{21EC2020-3AEA-1069-A2DD-08002B30309D} = CLSID_ControlPanel


Таким образом, вам, скорее всего, придется фильтровать их все.


0x01AA

Ха-ха, приятно видеть тебя здесь и иметь 5 :-)
Все еще используешь свои "инди-компоненты" ;)

MyOldAccount

5ed, спасибо