3

我正在尝试创建一个 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进行过滤吗?最好的方法是什么?

4

3 回答 3

4

当您有一个 IShellFolder 和一个子 pidl 时,您可以使用它SHGetDataFromIDList(...,SHGDFIL_DESCRIPTIONID)来获取 pidl 目标的 CLSID。

也可以看看:

于 2012-06-10T10:27:10.017 回答
0

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

于 2013-10-22T16:30:14.203 回答
-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);
于 2012-06-10T09:06:34.280 回答