使用IShellFolder::EnumObjects()不能正确枚举“我的电脑”下的对象,为什么

时间:2021-09-17 19:45:47
使用IShellFolder::EnumObjects()不能正确枚举虚目录“我的电脑”下的对象,为什么?
但是同样的方法却能正确枚举出“桌面”下的对象。
注意:不能正确枚举和不能枚举是不同的,不能正确枚举意思是:能枚举出来东西,但是获得的图标和DisplayName都不对。
程序如下,请高手帮忙瞧一瞧。
// m_pDirTree 为类成员变量
m_pDirTree=(CTreeCtrl *)GetDlgItem(IDC_TREE_PIDL);

::SetWindowLong(m_pDirTree->GetSafeHwnd(),GWL_STYLE,::GetWindowLong(m_pDirTree->GetSafeHwnd(),GWL_STYLE)|LVS_SHAREIMAGELISTS);
// 获得系统ImageList
SHFILEINFO sfi;
// m_hSysImageList 为类成员变量
m_hSysImageList=(HIMAGELIST)::SHGetFileInfo("C:\\",NULL,&sfi,sizeof(SHFILEINFO),SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
CImageList *pSysImageList;
m_pDirTree->SetImageList(pSysImageList->FromHandle(m_hSysImageList), LVSIL_NORMAL);

LPMALLOC pMalloc;
::SHGetMalloc(&pMalloc);

LPITEMIDLIST pidl;
::SHGetSpecialFolderLocation(GetSafeHwnd(),CSIDL_DRIVES ,&pidl);

IShellFolder *pDesktop,*pMyComputer;
::SHGetDesktopFolder(&pDesktop);
pDesktop->BindToObject(pidl,NULL,IID_IShellFolder,(void **)&pMyComputer);

IEnumIDList *pEnum;
pMyComputer->EnumObjects(GetSafeHwnd(),SHCONTF_FOLDERS, &pEnum);
LPITEMIDLIST pidl_1;
while(S_FALSE!=pEnum->Next(1,&pidl_1,NULL))
{
SHFILEINFO sfi;
::SHGetFileInfo((LPCTSTR)pidl_1,0,&sfi,sizeof(SHFILEINFO),SHGFI_ICON | SHGFI_SMALLICON | SHGFI_PIDL | SHGFI_DISPLAYNAME);
TVINSERTSTRUCT tis;
tis.hInsertAfter=NULL;
tis.hParent=NULL;
tis.item.iImage=sfi.iIcon;
tis.item.pszText=sfi.szDisplayName;
tis.item.mask=TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
m_pDirTree->InsertItem(&tis);
//CString str;
//str.Format("%d",pidl_1);
//MessageBox(str);
pMalloc->Free(pidl_1);
}

pMalloc->Free(pidl);
pMalloc->Release();
pDesktop->Release();
pMyComputer->Release();
pEnum->Release();

4 个解决方案

#1


呵呵,当然不能,它同时不能得到“我的文档”“回收站”等等信息。
你是不是在重载CTreeCtrl?呵呵,做一个显示目录的类?我有现成的,留下mail,发给你!

#2


为什么连“我的文档”也不行?
如果说因为“我的电脑”是“纯”虚目录而不行,那还可以理解,因为用这种方法确实可以获得“桌面”的子对象,“我的文档”和“桌面”一样,也有对应的物理目录呀!!
何况我所找到的msdn文档里没有说明IShellFolder::EnumObjects不能枚举“我的电脑”之类的“纯”需目录呀!!也许,我没有找到msdn里相应的说明,能不能帮我解释一下。
谢谢 fanalpha@sohu.com

#3


给你发了,查收!
我用的是XP,也许这和系统中的一些东西有关吧。

#4


谢谢,已经给分了,不过麻烦你重新发一遍好吗?我的防火墙把附件给删掉了!!

#1


呵呵,当然不能,它同时不能得到“我的文档”“回收站”等等信息。
你是不是在重载CTreeCtrl?呵呵,做一个显示目录的类?我有现成的,留下mail,发给你!

#2


为什么连“我的文档”也不行?
如果说因为“我的电脑”是“纯”虚目录而不行,那还可以理解,因为用这种方法确实可以获得“桌面”的子对象,“我的文档”和“桌面”一样,也有对应的物理目录呀!!
何况我所找到的msdn文档里没有说明IShellFolder::EnumObjects不能枚举“我的电脑”之类的“纯”需目录呀!!也许,我没有找到msdn里相应的说明,能不能帮我解释一下。
谢谢 fanalpha@sohu.com

#3


给你发了,查收!
我用的是XP,也许这和系统中的一些东西有关吧。

#4


谢谢,已经给分了,不过麻烦你重新发一遍好吗?我的防火墙把附件给删掉了!!