如何过滤IShellFolder :: EnumObjects结果

时间:2012-06-10 06:51:43

标签: c++ visual-c++ windows-shell

我正在尝试创建一个shell树控件。我不希望从IShellFilder::EnumObjects调用返回的所有项目都显示在树上,因为我需要过滤诸如回收站和控制面板之类的项目。

我的代码如下所示:

IShellFolder* pDesktopFolder=NULL;
SHGetDesktopFolder(&pDesktopFolder);


LPITEMIDLIST pidlParent=NULL;
IShellFolder* pParentFolder = NULL;
pDesktopFolder->BindToObject(pidlParent,NULL, IID_IShellFolder, (LPVOID*)&pParentFolder);

IEnumIDList* pEnumIDList = NULL;
    SHCONTF SHFlag=NULL;
    SHFlag=SHCONTF_FOLDERS | SHCONTF_INIT_ON_FIRST_NEXT | SHCONTF_NONFOLDERS  | SHCONTF_INCLUDEHIDDEN;

HRESULT hr= pParentFolder->EnumObjects(NULL, SHFlag, &pEnumIDList);

if (NOERROR == hr)
{
     LPITEMIDLIST pidl = NULL, pidlAbs;
     CString csFileType;
     HTREEITEM hItem=NULL;
     while (NOERROR == pEnumIDList->Next(1, &pidl, NULL))
     {
        //Filter out control panel, recycle bin items and other non usable items
     }
}

我不想获取每个项目的显示名称,并对其进行字符串比较,因为名称可能会根据操作系统语言而改变。

可以根据每个项目的CLSID完成过滤吗?最新的方式是什么?

3 个答案:

答案 0 :(得分:1)

如果您有IShellFolder和子pidl,则可以使用SHGetDataFromIDList(...,SHGDFIL_DESCRIPTIONID)获取pidl目标的CLSID。

另见:

答案 1 :(得分:0)

看起来你只想拥有真正的文件系统项(就像BrowseForFolder一样),那么你可以使用GetAttributesOf(..)并检查SFGAO_FILESYSANCESTOR,如果它没有属性,它就不是'文件系统项..(zip文件,控制面板,recyclebin没有属性)

答案 2 :(得分:-1)

解决:

我做了这个以及它的工作,但我需要看看在哪里可以获得其他文件夹的GUID列表:

ULONG nEaten=0;
    LPITEMIDLIST PidlCPanel;
    ULONG nCPAttrib = 0;
    HRESULT hr = pFolder->ParseDisplayName(NULL, NULL, _T("::{26EE0668-A00A-44D7-9371-BEB064C98683}"), &nEaten, &PidlCPanel, &nCPAttrib);
    BOOL bRes = ILIsEqual(pidl, PidlCPanel);