2012-06-10 3 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 
    } 
} 

내가 각 항목의 표시 이름을 얻고 이름이 OS 언어에 따라 변경 될 수 있기 때문에 그것에 대한 문자열 비교하고 싶지 않아.

각 항목의 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()'함수를 사용하여 휴지통 ('CSIDL_BITBUCKET' /'FOLDERID_RecycleBinFolder')과 제어판 ('CSIDL_CONTROLS' /'FOLDERID_ControlPanelFolder')을 포함한 시스템 폴더에 대한 ITEMIDLIST를 얻으십시오.). –

+0

내 코드 컨텍스트에서 이들을 사용하는 방법에 대한 답변을 게시 할 수 있습니다 –

+0

또한 SHGetKnownFolderIDList는 XP에서 사용할 수 없다는 점을 유의하십시오. –

0

당신이 유일한 파일 시스템 항목을 갖고 싶어 보인다 (BrowseForFolder와 마찬가지로) GetAttributesOf(..)을 사용하고 SFGAO_FILESYSANCESTOR을 확인할 수 있습니다. 속성이 없으면 파일 시스템 항목이 아닙니다. (zip 파일, 제어판, recyclebin에는 속성이 없습니다)

+0

흠 .. 알아 냈어, 그 zip 파일은 필터링되지 않았다. 이상하게도 .. SFGAO_BROWSABLE에있는 zip 파일도 검사해야한다. (SFGA_FILESYSANCESTOR와 SFGA_BROWSABLE이면 SFGA_FILESYSTEM을 체크한다. 'SFGA_STREAM'을 확인하는 것은 좋은 생각이 아닙니다. 시스템에서 '컴퓨터'아래의 모든 폴더와 특정 드라이브가 설정되어있는 것 같습니다 (Windows 7 x64 궁극). – SuperDre

+0

Windows XP에서 'SFGA_BROWSABLE' 폴더에 대한 유효한 속성이 될 수 있으며 zip 파일은 표시되지 않습니다 .. grrrr .. 이건 정말 짜증나, 다음 번에는 모든 플랫폼에서 모든 것이 똑같이 작동하는지 확인하는 방법입니다. 그래서 zip 파일 (또는 .cab 파일), 다시 드로잉 보드에 .. – SuperDre

관련 문제