다음을 통해 공유


네임스페이스 탐색

이제 네임스페이스의 아무 곳이나 탐색하는 데 필요한 모든 필수 요소가 있습니다. 가장 간단한 시작 방법은 애플리케이션이 SHGetDesktopFolder 를 호출하여 데스크톱의 IShellFolder 인터페이스를 검색하도록 하는 것입니다. 그런 다음 네임스페이스를 아래쪽으로 탐색하려면 애플리케이션이 다음 단계를 수행할 수 있습니다.

  1. 폴더의 내용을 열거합니다.
  2. 하위 폴더인 개체를 결정하고 하나를 선택합니다.
  3. 하위 폴더에 바인딩하여 해당 IShellFolder 인터페이스를 검색합니다.

대상에 도달하기 위해 필요에 따라 이러한 단계를 자주 반복합니다.

네임스페이스 탐색의 간단한 예

다음 샘플 코드는 이전 섹션에서 설명한 여러 절차를 보여 주는 간단한 콘솔 애플리케이션입니다. 명확성을 위해 오류 검사를 생략했습니다. 이 애플리케이션은 다음 작업을 수행합니다.

  1. Program Files 폴더의 IShellFolder 인터페이스를 검색합니다(IShellFolder 인터페이스 사용).
  2. 폴더의 내용을 열거합니다(폴더의 내용 열거).
  3. 모든 표시 이름을 결정하고 인쇄합니다(표시 이름 및 기타 속성 결정).
  4. 하위 폴더를 찾습니다(하위 폴더의 IShellFolder 인터페이스에 대한 포인터 가져오기).
  5. 찾은 첫 번째 하위 폴더에 바인딩합니다(하위 폴더의 IShellFolder 인터페이스에 대한 포인터 가져오기).
  6. 하위 폴더에 있는 개체의 표시 이름을 인쇄합니다.
#include <shlobj.h>
#include <shlwapi.h>
#include <iostream.h>

main()
{
    LPITEMIDLIST pidlProgFiles = NULL;
    LPITEMIDLIST pidlItems = NULL;
    IShellFolder *psfFirstFolder = NULL;
    IShellFolder *psfDeskTop = NULL;
    IShellFolder *psfProgFiles = NULL;
    LPENUMIDLIST ppenum = NULL;
    ULONG celtFetched;
    HRESULT hr;
    STRRET strDispName;
    TCHAR pszDisplayName[MAX_PATH];
    ULONG uAttr;
   
    CoInitialize( NULL );
    
    hr = SHGetFolderLocation(NULL, CSIDL_PROGRAM_FILES, NULL, 0, &pidlProgFiles);

    hr = SHGetDesktopFolder(&psfDeskTop);

    hr = psfDeskTop->BindToObject(pidlProgFiles, NULL, IID_IShellFolder, (LPVOID *) &psfProgFiles);
    psfDeskTop->Release();

    hr = psfProgFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);

    while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
    {
        psfProgFiles->GetDisplayNameOf(pidlItems, SHGDN_INFOLDER, &strDispName);
        StrRetToBuf(&strDispName, pidlItems, pszDisplayName, MAX_PATH);
        cout << pszDisplayName << '\n';
        if(!psfFirstFolder)
        {
            uAttr = SFGAO_FOLDER;
            psfProgFiles->GetAttributesOf(1, (LPCITEMIDLIST *) &pidlItems, &uAttr);
            if(uAttr & SFGAO_FOLDER)
            {
                hr = psfProgFiles->BindToObject(pidlItems, NULL, IID_IShellFolder, (LPVOID *) &psfFirstFolder);
            }
        }
        CoTaskMemFree(pidlItems);
    }

    cout << "\n\n";

    ppenum->Release();

    if(psfFirstFolder)
    {
        hr = psfFirstFolder->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);

        while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
        {
            psfFirstFolder->GetDisplayNameOf(pidlItems, SHGDN_INFOLDER, &strDispName);
            StrRetToBuf(&strDispName, pidlItems, pszDisplayName, MAX_PATH);
            cout << pszDisplayName << '\n';
            CoTaskMemFree(pidlItems);
        }
    }

    ppenum->Release();
    CoTaskMemFree(pidlProgFiles);
    psfProgFiles->Release();
    psfFirstFolder->Release();

    CoUninitialize();
    return 0;
}