我正在尝试创建一个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完成过滤吗?最新的方式是什么?
答案 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);