2012-06-10 57 views
1

我想創建一個殼樹控件。我不希望所有從IShellFilder::EnumObjects調用返回的項目都顯示在樹上,因爲我需要過濾諸如回收站和控制面板等項目。如何篩選的IShellFolder :: 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

解決:

我做這個和它的工作,但我需要看到我在哪裏可以得到其他文件夾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); 
+0

你不應該使用的系統文件夾的GUID這樣。使用'SHGetFolderLocation()'和/或'SHGetKnownFolderIDList()'函數來獲取'ITEMIDLIST's系統文件夾,包括回收站('CSIDL_BITBUCKET' /'FOLDERID_RecycleBinFolder')和控制面板('CSIDL_CONTROLS' /'FOLDERID_ControlPanelFolder' )。 –

+0

可以發佈有關如何在我的代碼上下文中使用這些代碼的答案 –

+0

還要記住,SHGetKnownFolderIDList不適用於XP。 –

0

看來,如果你只希望有真正的文件系統項目(就像BrowseForFolder),那麼你可以使用GetAttributesOf(..)並檢查SFGAO_FILESYSANCESTOR,如果它沒有這個屬性,它不是一個文件系統項目。(zip文件,控制面板,recyclebin沒有這個屬性)

+0

嗯..發現,這zipfiles不過濾(怪異)..你必須檢查'SFGAO_BROWSABLE'一個zip文件太(所以如果它是'SFGA_FILESYSANCESTOR'和'SFGA_BROWSABLE',甚至檢查'SFGA_FILESYSTEM'。檢查'SFGA_STREAM'是不是一個好主意,因爲在我的系統下的「計算機」和指定的驅動器的所有文件夾似乎有它設置(Windows 7的64位旗艦版)。 – SuperDre

+0

哦,親愛的,只是發現了在Windows XP中'SFGA_BROWSABLE'可以是一個文件夾的有效屬性,並且不會顯示zip文件.. grrrr ..這真的很煩人,下一次MS如何確保所有平臺上的所有內容都是一樣的...所以zipfiles(或.cab文件),回到繪圖板.. – SuperDre