폴더 ID 가져오기

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

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

OpenFiles 대화 상자

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

Windows Vista 이상에서는 폴더를 선택하는 것이 좋습니다.

SHBrowseForFolder 대화 상자

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

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

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

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

특수 폴더 및 CSIDL

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

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

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

CSIDL은 여러 Shell 함수 중 하나와 함께 특수 폴더의 PIDL 또는 특수 파일 시스템 폴더의 경로를 검색하는 데 사용됩니다. 폴더가 시스템에 없는 경우 애플리케이션은 CSIDL을 CSIDL_FLAG_CREATE 결합하여 강제로 만들 수 있습니다. CSIDL은 다음 함수에 전달할 수 있습니다.

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

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에서 반환한 ID 목록을 해제하는 것은 호출 애플리케이션의 책임입니다.