【问题标题】:Seeking correct CLSID for Control Panel为控制面板寻找正确的 CLSID
【发布时间】: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/…)

标签: c++ winapi


【解决方案1】:

根据注册表1{26EE0668-A00A-44D7-9371-BEB064C98683} 用于“控制面板”,而{21EC2020-3AEA-1069-A2DD-08002B30309D} 用于“所有控制面板项目”。

1:查看HKEY_CLASSES_ROOT\CLSID\{26EE0668-A00A-44D7-9371-BEB064C98683}HKEY_CLASSES_ROOT\CLSID\{21EC2020-3AEA-1069-A2DD-08002B30309D} 键。

根据Complete List of Windows 10 CLSID Key (GUID) Shortcuts

控制面板 {5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0} 控制面板(所有任务){ED7BA470-8E54-465E-825C-99712043E01C} 控制面板(始终为类别视图){26EE0668-A00A-44D7-9371-BEB064C98683} 控制面板(始终图标视图){21EC2020-3AEA-1069-A2DD-08002B30309D}

CLSID Key (GUID) Shortcuts List for Windows 7相同:

控制面板 {5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0} 控制面板(所有任务){ED7BA470-8E54-465E-825C-99712043E01C} 控制面板(类别视图){26EE0668-A00A-44D7-9371-BEB064C98683} 控制面板(图标视图){21EC2020-3AEA-1069-A2DD-08002B30309D}

根据Magic Number Database,这些CLSID标记如下:

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

因此,您可能必须过滤所有这些,例如:

// CLSID_ControlPanel is already defined in shlguid.h
DEFINE_GUID(CLSID_ControlPanelRecent, 0x5399E694, 0x6CE5, 0x4D6C, 0x8F, 0xCE, 0x1D, 0x88, 0x70, 0xFD, 0xCB, 0xA0);
DEFINE_GUID(CLSID_ControlPanelTasks, 0xED7BA470, 0x8E54, 0x465E, 0x82, 0x5C, 0x99, 0x71, 0x20, 0x43, 0xE0, 0x1C);
DEFINE_GUID(CLSID_ControlPanelCategory, 0x26EE0668, 0xA00A, 0x44D7, 0x93, 0x71, 0xBE, 0xB0, 0x64, 0xC9, 0x86, 0x83);

...

skip = (
    (pdid.clsid == CLSID_ControlPanel) ||
    (pdid.clsid == CLSID_ControlPanelRecent) ||
    (pdid.clsid == CLSID_ControlPanelTasks) ||
    (pdid.clsid == CLSID_ControlPanelCategory)
);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-03-25
  • 2014-07-16
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 2018-05-16
  • 1970-01-01
相关资源
最近更新 更多