다음을 통해 공유


폴더 ID 가져오기

네임스페이스 개체를 사용하려면 네임스페이스 개체를 식별하는 방법이 필요합니다. 즉, 항목 식별자 목록(PIDL)의 포인터를 얻거나 파일 시스템 개체의 경우 그 경로를 얻는 것을 의미합니다. 이 섹션에서는 개체 ID를 가져오는 두 가지 간단한 방법에 대해 설명합니다.

모든 폴더에서 작동하는 보다 강력한 방법은 IShellFolder 인터페이스를 사용합니다. 자세한 내용은 폴더 내용에 대한 정보 가져오기를 참조하세요.

OpenFiles 대화 상자

사용자가 네임스페이스를 탐색하고 폴더를 선택할 수 있도록 하려면 애플리케이션에서 IFileDialog 인터페이스를 사용할 수 있습니다. FOS_PICKFOLDERS 플래그를 사용하여 이 인터페이스를 호출하면 "폴더 선택" 모드에서 파일 열기 일반 대화 상자가 시작됩니다.

Windows Vista 이상에서는 폴더를 선택하는 데 이 방법이 권장됩니다.

SHBrowseForFolder 대화 상자

사용자가 네임스페이스를 탐색하고 폴더를 선택할 수 있도록 하려면 애플리케이션이 SHBrowseForFolder호출하기만 하면 됩니다. 이 함수를 호출하면 열기 또는 SaveAs 일반적인 대화 상자와 유사한 UI가 있는 대화 상자가 시작됩니다.

사용자가 폴더를 선택하면 SHBrowseForFolder 폴더의 정규화된 PIDL 및 표시 이름을 반환합니다. 폴더가 파일 시스템에 있는 경우 애플리케이션은 SHGetPathFromIDList호출하여 PIDL을 경로로 변환할 수 있습니다. 애플리케이션은 루트 폴더를 지정하여 사용자가 선택할 수 있는 폴더 범위를 제한할 수도 있습니다. 네임스페이스의 루트 아래에 있는 폴더만 표시됩니다. 다음 그림에서는 루트 폴더가 Program Files로 설정된 SHBrowseForFolder 대화 상자를 보여 줍니다.

폴더 찾아보기 대화 상자의 스크린샷

SHBrowseForFolder 사용하는 방법에 대한 간단한 예제는 나중에 제공됩니다.

특수 폴더 및 CSIDL

일반적으로 사용되는 여러 폴더는 시스템에서 특수 지정됩니다. 이러한 폴더는 잘 정의된 용도를 가지며 대부분의 폴더는 모든 시스템에 있습니다. 처음에 존재하지 않더라도 이름과 위치는 여전히 정의되므로 나중에 추가할 수 있습니다. 특수 폴더 컬렉션에는 프린터, 내 문서 및 네트워크 환경과 같은 시스템의 모든 표준 가상 폴더가 포함됩니다. 또한 프로그램 파일 및 시스템과 같은 여러 표준 파일 시스템 폴더가 포함되어 있습니다.

폴더는 모든 시스템의 표준 구성 요소이지만 네임스페이스의 이름과 위치는 다를 수 있습니다. 예를 들어 시스템 디렉터리가 일부 시스템의 경우 C:\Winnt\System32이고 다른 시스템의 경우 C:\Windows\System32입니다. 과거에 환경 변수는 특정 시스템에서 특수 폴더의 이름과 위치를 확인하는 방법을 제공했습니다. 이제 Shell은 CSIDL특수 폴더를 식별하는 보다 강력하고 유연한 방법을 제공합니다. 일반적으로 환경 변수 대신 사용해야 합니다.

CSIDL은 특정 시스템의 이름이나 위치에 관계없이 특수 폴더를 식별하고 찾는 균일한 방법을 제공합니다. 환경 변수와 달리 CSIDL은 가상 폴더 및 파일 시스템 폴더와 함께 사용할 수 있습니다. 각 특수 폴더에는 고유한 CSIDL이 할당되어 있습니다. 예를 들어 Program Files 파일 시스템 폴더에는 CSIDL_PROGRAM_FILESCSIDL이 있고 네트워크 환경 가상 폴더에는 CSIDL_NETWORKCSIDL이 있습니다.

CSIDL은 특수 폴더의 PIDL 또는 특수 파일 시스템 폴더의 경로를 검색하기 위해 여러 셸 함수 중 하나와 함께 사용됩니다. 시스템에 폴더가 없으면, 애플리케이션에서 CSIDL을 CSIDL_FLAG_CREATE과 결합함으로써 강제로 생성할 수 있습니다. CSIDL은 다음 함수에 전달될 수 있습니다.

  • 특수 폴더의 PIDL을 검색하는 SHGetFolderLocation.
  • SHGetFolderPath, 파일 시스템 특수 폴더의 경로를 검색합니다.

이러한 두 함수는 셸 버전 5.0에서 도입되었으며 SHGetSpecialFolderLocation 대체하고 SHGetSpecialFolderPath 함수를 대체합니다.

CSIDL 및 SHBrowseForFolder를 사용하는 방법의 간단한 예

다음 샘플 함수인 PidlBrowse는 CSIDL을 사용하여 폴더의 PIDL을 검색하고 SHBrowseForFolder 사용하여 사용자가 폴더를 선택하도록 하는 방법을 보여 줍니다. 선택한 폴더의 PIDL 및 표시 이름을 반환합니다.

LPITEMIDLIST PidlBrowse(HWND hwnd, int nCSIDL, LPSTR pszDisplayName)
{
    LPITEMIDLIST pidlRoot = NULL;
    LPITEMIDLIST pidlSelected = NULL;
    BROWSEINFO bi = {0};

    if(nCSIDL)
    {
        SHGetFolderLocation(hwnd, nCSIDL, NULL, NULL, &pidlRoot);
    }

    else
    {
        pidlRoot = NULL;
    }

    bi.hwndOwner = hwnd;
    bi.pidlRoot = pidlRoot;
    bi.pszDisplayName = pszDisplayName;
    bi.lpszTitle = "Choose a folder";
    bi.ulFlags = 0;
    bi.lpfn = NULL;
    bi.lParam = 0;

    pidlSelected = SHBrowseForFolder(&bi);

    if(pidlRoot)
    {
        CoTaskMemFree(pidlRoot);
    }

    return pidlSelected;
}

호출 애플리케이션은 SHBrowseForFolder에 필요한 창 핸들을 을(를) 전달합니다. nCSIDL 매개 변수는 루트 폴더를 지정하는 데 사용되는 선택적 CSIDL입니다. 계층 구조의 루트 폴더 아래에 있는 폴더만 표시됩니다. 앞에서 보여 준 그림은 nCSIDLCSIDL_PROGRAM_FILES설정된 이 함수를 호출하여 생성되었습니다. 호출 애플리케이션은 pszDisplayName 문자열 버퍼를 전달하여 PidlBrowse가 반환될 때 선택한 폴더의 표시 이름을 저장합니다. CoTaskMemFree사용하여 SHBrowseForFolder 반환된 IDList를 해제하는 것은 호출 애플리케이션의 책임입니다.