이 항목에서는 프로그램에서 라이브러리를 사용할 때 고려해야 할 몇 가지 사항에 대해 설명합니다.
이 항목에서는 다음을 수행합니다.
- 라이브러리 프로그래밍 개요
-
라이브러리로 프로그래밍
- 알려진 폴더에서 라이브러리로 이동
- 홈 그룹 및 공유 라이브러리
- 라이브러리와 함께 공통 파일 대화 상자 사용
- 사용자 인터페이스 라이브러리 선택 사용
- 프로그램에서 라이브러리 콘텐츠 액세스
- 사용자 콘텐츠를 라이브러리에 저장
- 라이브러리에서 끌어서 놓기 작업 지원
-
라이브러리와의 동기화 유지
- 대량 업데이트
- Shell API 알림
- 파일 시스템 API 알림
- 관련 항목
라이브러리 프로그래밍 개요
라이브러리를 사용하면 사용자가 파일 시스템 조직에 의해 제한되지 않고 의미 있는 방식으로 파일 기반 콘텐츠를 구성할 수 있습니다. 프로그램이 라이브러리를 지원하는 경우 사용자가 Windows 7 사용자 환경과 일치하는 사용자 인터페이스를 제시하는 동안 사용자에게 적합한 방식으로 콘텐츠를 찾을 수 있습니다. 또한 라이브러리를 사용하면 프로그램이 다른 폴더 또는 다른 컴퓨터에 저장된 파일 기반 콘텐츠를 더 쉽게 찾을 수 있습니다.
이 섹션의 항목에서는 라이브러리 지원을 프로그램에 추가하고 라이브러리에서 제공하는 새로운 기능을 활용하는 방법에 대해 설명합니다. Windows 7은 기본적으로 이 지원의 일부를 제공합니다. 프로그램에서 현재 사용하는 일반적인 파일 대화 상자를 수정하지 않는 경우 라이브러리를 지원하기 위해 추가 프로그래밍이 거의 필요하지 않을 수 있습니다.
이 섹션에서는 라이브러리가 제공하는 몇 가지 주요 기능과 프로그램에서 라이브러리를 지원하는 방법에 대해 설명합니다. 이 정보를 사용하여 프로그램에서 최상의 사용자 환경을 제공할 기능을 결정할 수 있습니다. 프로그램에서 일반적인 파일 대화 상자를 사용자 지정하는 경우 이 섹션의 정보를 통해 새 공통 파일 대화 상자를 사용하여 라이브러리를 사용하고 Windows 7에서 동등한 기능을 제공하는 방법을 결정할 수 있습니다.
라이브러리를 사용한 프로그래밍
Windows Shell 프로그래밍 모델은 프로그램이 Windows Shell 프로그래밍 개체와 상호 작용하는 방법을 설명합니다. 파일 및 디렉터리와 같은 파일 시스템 개체는 Windows Shell 개체로 표현되지만 모든 Windows Shell 개체가 파일 시스템으로 표현되는 것은 아닙니다. 예를 들어 라이브러리는 파일 시스템에 해당하는 개체가 없는 Windows Shell 개체입니다. 프로그램에서 Windows Shell 개체를 사용하면 프로그램에서 파일 시스템 개체뿐만 아니라 모든 셸 개체에 액세스할 수 있습니다.
최상의 결과를 얻으려면 프로그램에서 셸 라이브러리 API 사용하여 라이브러리와 상호 작용하고 해당 콘텐츠에 액세스합니다. 라이브러리에는 폴더 및 파일과 같은 파일 시스템 항목이 포함되지만 라이브러리는 파일 시스템 항목이 아닙니다. 따라서 파일 시스템 API를 사용하여 라이브러리 기능 또는 라이브러리 콘텐츠에 액세스할 수 없습니다.
현재 많은 파일 시스템 API를 사용하는 기존 프로그램이 있는 경우 프로그램에서 라이브러리 기능을 계속 활용할 수 있습니다. 셸 라이브러리 API 라이브러리에 있는 항목에 대한 파일 시스템 참조를 제공할 수 있으며 파일 이름 및 경로와 같은 이러한 파일 시스템 참조를 기존 프로그램에 있는 기존 파일 시스템 API에 전달할 수 있습니다.
알려진 폴더에서 라이브러리로 이동
Windows 7 이전에는 파일 저장 또는 파일 열기 작업의 기본 폴더로 알려진 폴더(예: 내 문서 폴더)를 사용하는 것이 일반적이었습니다. Windows 7에서는 사용자가 Windows 탐색기 같은 다른 Windows 7 프로그램과 동일한 환경을 사용할 수 있도록 해당 라이브러리를 사용해야 합니다.
현재 프로그램에서 Windows Shell API를 사용하는 경우 라이브러리 지원을 추가하는 것은 간단합니다. 예를 들어 현재 SHGetKnownFolderItem 함수를 호출하여 내 문서 폴더의 위치를 가져오는 경우 알려진 내 문서 폴더의 KNOWNFOLDERID 값을 해당 라이브러리의 KNOWNFOLDERID 값으로 바꿀 수 있습니다.
다음 표에서는 알려진 폴더의 KNOWNFOLDERID 값과 Windows 7에 있는 해당 라이브러리의 KNOWNFOLDERID 값 간의 관계를 보여 줍니다.
| 알려진 폴더 KNOWNFOLDERID 값 | LIBRARY KNOWNFOLDERID 값 |
|---|---|
| FOLDERID_Documents | FOLDERID_DocumentsLibrary |
| FOLDERID_Pictures | FOLDERID_PicturesLibrary |
| 폴더ID_음악 | FOLDERID_음악라이브러리 |
| 녹화된TV_폴더ID | FOLDERID_녹화된TV라이브러리 |
홈 그룹 및 공유 라이브러리
프로그램에 라이브러리 지원을 추가하면 HomeGroup에서 공유 라이브러리를 지원할 수 있습니다. HomeGroup은 KNOWNFOLDERID 값인 FOLDERID_HomeGroup로 식별됩니다. 프로그램은 IShellLibrary::GetDefaultSaveFolder 메서드 호출에서 DEFAULTSAVEFOLDERTYPE 값을 설정하여 사용자의 개인 또는 공유 기본 저장 위치를 식별할 수 있습니다.
라이브러리와 함께 일반 파일 대화 상자 사용
라이브러리가 있는 일반 파일 대화 상자를 사용하여 Windows 7의 라이브러리를 지원하도록 일반 파일 대화 상자가 업데이트되었습니다. 다음 그림에서는 Windows 7에서 사용자에게 일반적인 파일 대화 상자가 표시되는 방법을 보여 줍니다.
라이브러리
Windows 7에서 프로그램에서 현재 공통 파일 대화 상자를 표시하고 대화 상자 템플릿을 변경하거나 이벤트를 후크하지 않으면 새 Windows 7 버전의 대화 상자가 자동으로 표시됩니다. 특히 공통 파일 대화 상자 함수에 대한 호출에서 lpfnHook, hInstance, OPENFILENAME 구조의 lpTemplatename 멤버는 NULL 있어야 하며 OFN_ENABLEHOOK 및 OFN_ENABLETEMPLATE 플래그는 지워야 합니다.
Windows 7에서 IFileDialog관련 인터페이스는 이전 버전의 Windows에서 사용된 일반적인 파일 대화 상자 함수를 대체합니다. 이전의 일반적인 파일 대화 상자 함수는 Windows 7에서 계속 지원되지만 완전한 Windows 7 사용자 환경을 제공하지 않으며 라이브러리를 지원하지 않습니다. IFileDialog 관련 인터페이스에서 지원하는 새로운 기능 중 일부는 다음과 같습니다.
- 사용자는 Windows 7 Windows 탐색기에서 지원하는 파일 속성에 액세스하여 파일을 검색하고 선택할 수 있습니다.
- 프로그램은 셸 네임스페이스 API의 인터페이스와 메서드를 사용하여 항목을 사용할 수 있습니다.
- 프로그램은 리소스 파일 기반 사용자 지정 모델 대신 데이터 기반 사용자 지정 모델을 사용하여 공통 파일 대화 상자에 새 컨트롤을 추가할 수 있습니다.
다음과 같은 경우 IFileDialog관련 인터페이스를 사용해야 합니다.
- Windows 7에서 프로그램에 대한 일반 파일 대화 상자를 사용자 지정해야 합니다. 이렇게 하면 프로그램이 라이브러리와 함께 작동하고 대화 상자 사용자 지정을 지원할 수 있습니다.
- 사용자가 공통 파일 대화 상자에서 여러 파일을 선택할 수 있도록 합니다. 이렇게 하면 라이브러리에 다른 폴더에 저장된 콘텐츠가 있을 수 있으므로 선택한 개체에 대한 올바른 경로를 얻을 수 있습니다.
IFileDialog관련 인터페이스에 대한 자세한 내용은 다음을 참조하세요.
- IFileDialog
- IFileOpenDialog
- IFileSaveDialog
- IFileDialogCustomize
- IFileDialogEvents
- IFileDialogControlEvents
사용자 인터페이스에서 라이브러리 선택 활성화
프로그램에서 사용자가 Windows 7에서 가져오기 또는 내보내기 함수와 같은 폴더를 선택할 수 있도록 허용하는 경우 사용자가 라이브러리를 선택할 수 있도록 허용해야 합니다. IFileOpenDialog 인터페이스 및 SHBrowseForFolder 함수를 사용하면 폴더를 선택하라는 메시지가 표시되면 라이브러리를 선택할 수 있습니다. IFileOpenDialog Windows 7 사용자 인터페이스를 지원하므로 IFileOpenDialog 인터페이스는 SHBrowseForFolder 함수보다 선호됩니다.
사용자가 IFileOpenDialog 인터페이스를 사용할 때 폴더를 선택할 수 있도록 하려면 FOS_PICKFOLDERS 플래그가 설정된 SetOptions를 호출하고 FOS_FORCEFILESYSTEM 플래그가 명확한지 확인합니다.
FILEOPENDIALOGOPTIONS fileOptions;
hr = fileOpenDialogBox->GetOptions(&fileOptions);
fileOptions = fileOptions | FOS_PICKFOLDERS | ~FOS_FORCEFILESYSTEM;
hr = fileOpenDialogBox->SetOptions(fileOptions);
사용자가 SHBrowseForFolder 함수를 호출할 때 폴더를 선택할 수 있도록 하려면 BROWSEINFO 구조체의 ulFlags 멤버에서 BIF_USENEWUI 플래그를 설정하고 BIF_RETURNONLYFSDIRS 플래그를 지웁니다.
BROWSEINFO browseInfo;
browseInfo.ulFlags = BIF_USENEWUI | ~BIF_RETURNONLYFSDIRS;
// Set other member values
pidl = SHBrowseForFolder(&browseInfo);
프로그램에서 라이브러리 콘텐츠 액세스
라이브러리의 콘텐츠에 액세스하려면 Windows Shell API를 사용해야 합니다. 라이브러리는 파일 시스템 개체가 아니므로 파일 시스템 API의 함수를 사용하여 라이브러리 콘텐츠에 액세스할 수 없습니다. 프로그램에서 파일 시스템 API를 기반으로 하는 사용자 지정 파일 브라우저를 사용하는 경우 라이브러리를 찾아보거나 라이브러리 콘텐츠에 액세스할 수 없습니다.
이 섹션에서는 라이브러리를 사용하도록 프로그램을 업데이트하는 가장 좋은 방법을 선택할 수 있도록 라이브러리 콘텐츠에 액세스하는 방법을 설명합니다.
IShellLibrary 인터페이스를 사용하여 라이브러리 콘텐츠 액세스
프로그램이 라이브러리 콘텐츠에 액세스하는 가장 쉬운 방법은 셸 라이브러리 API사용하는 것입니다. 파일 시스템 API를 사용하는 프로그램에서 작업하는 경우 셸 라이브러리 API 라이브러리의 파일 시스템 폴더를 반환하여 기존 프로그램 코드의 변경을 최소화할 수 있습니다.
IShellLibrary *picturesLibrary;
hr = SHLoadLibraryFromKnownFolder(FOLDERID_PicturesLibrary,
STGM_READ,
IID_PPV_ARGS(&picturesLibrary));
// picturesLibrary now points to the user's picture library
IShellItemArray *pictureFolders;
hr = pslLibrary->GetFolders(LFF_FORCEFILESYSTEM, IID_PPV_ARGS(&pictureFolders));
// pictureFolders now contains an array of Shell items that
// represent the folders found in the user's pictures library
셸 API를 사용하여 라이브러리 콘텐츠 액세스
라이브러리 개체는 셸 프로그래밍 모델의 일부이므로 다른 Windows Shell API와 함께 사용할 수 있습니다. 예를 들어 IShellItem 및 IShellFolder 인터페이스를 관련 도우미 함수와 함께 사용하여 파일 시스템 API를 사용하여 콘텐츠에 액세스하기 위해 폴더 및 폴더 콘텐츠를 열거하는 것과 같은 방식으로 라이브러리의 내용에 액세스할 수 있습니다.
Windows 셸 API는 라이브러리의 내용에 액세스하는 두 개의 열거형 모드를 지원합니다.
찾아보기 열거형
찾아보기 열거형은 기본 열거형 모드이며 라이브러리 폴더의 내용을 열거합니다. SHCONTF_NAVIGATION_ENUM 플래그를 지우고 이 모드를 사용합니다.
탐색 열거형
탐색 열거형은 라이브러리 폴더를 열거합니다. 이 모드를 사용하도록 SHCONTF_NAVIGATION_ENUM 플래그를 설정합니다.
프로그램에서 사용자 지정 트리 컨트롤을 사용하여 사용자의 폴더를 탐색하는 경우 탐색 열거 모드에서 폴더를 열거하면 Windows 탐색기에서 Windows 7의 폴더를 열거하는 방법과 일치하는 라이브러리 폴더 목록이 제공됩니다.
프로그램에서 이러한 기능을 사용하는 방법에 대한 예제는 Windows SDK의 ShellStorage 샘플을 참조하세요.
라이브러리에 사용자 콘텐츠 저장
프로그램에서 라이브러리의 폴더뿐만 아니라 라이브러리에 사용자 콘텐츠를 저장할 수 있습니다. 마찬가지로 사용자는 라이브러리의 특정 폴더에 저장하거나 라이브러리에 저장할 수 있습니다.
모든 라이브러리에는 기본 저장 위치로 지정된 폴더가 있습니다. 기본 저장 위치는 라이브러리를 만들 때 정의됩니다. 그러나 사용자는 기본 저장 위치를 라이브러리의 모든 폴더로 다시 할당할 수 있습니다. 사용자가 기본 저장 위치를 구성할 필요는 없지만 변경할 수 있는 옵션이 있습니다. 사용자가 현재 기본 저장 위치로 설정된 폴더를 삭제하면 라이브러리는 라이브러리의 다음 폴더를 기본 저장 위치로 자동으로 구성합니다.
여러 가지 방법으로 라이브러리에 사용자 콘텐츠를 저장할 수 있습니다.
Shell API
셸 프로그래밍 모델을 사용하고 iShellItem, IStorage 또는 IStream나타내는 셸 항목을 라이브러리 개체에 저장하는 경우 셸 항목은 라이브러리의 기본 저장 위치에 자동으로 저장됩니다.
파일 시스템 API
많은 파일 시스템 API 호출을 사용하는 기존 프로그램이 있는 경우 라이브러리의 기본 저장 위치로 정의된 폴더의 경로를 가져올 수 있습니다. 그런 다음 폴더 경로를 파일 시스템 API에 전달할 수 있습니다.
프로그램에서 이러한 기능을 사용하는 방법에 대한 예제는 Windows SDK의 ShellStorage 샘플을 참조하세요.
라이브러리에서 끌어서 놓기 작업 지원
프로그램에서 끌어서 놓기 작업을 지원하는 경우 올바른 라이브러리 상호 작용을 지원하도록 업데이트해야 합니다. 파일이 라이브러리에 놓이면 삭제된 파일을 기본 저장 위치에 저장해야 합니다. 폴더를 라이브러리에 놓으면 삭제된 폴더를 라이브러리에 새 폴더로 추가해야 합니다. 파일이 기본 저장 위치가 아닌 기존 폴더에 삭제된 경우 선택한 폴더에 파일을 추가해야 합니다.
프로그램 끌어서 놓기 기능에 대한 라이브러리 지원을 추가하는 방법에 대한 예제는 Windows SDK의 ShellLibraryCommandLine 샘플을 참조하세요.
라이브러리와 동기화 유지
이 항목에서는 프로그램이 라이브러리의 콘텐츠 보기를 up-to-date 유지하는 방법에 대해 설명합니다.
대량 업데이트
프로그램이 실행되지 않을 때 사용자가 라이브러리의 폴더를 대화형으로 수정할 수 있으므로 프로그램이 라이브러리의 변경 내용을 검색하고 저장하기 시작할 때 SHResolveLibrary 호출해야 합니다. Shell API는 프로그램이 라이브러리의 현재 콘텐츠와 라이브러리에 포함될 수 있는 폴더의 현재 위치를 가져올 수 있도록 하는 SHResolveLibrary 함수를 제공합니다.
유의해야 할 점은, SHResolveLibrary는 라이브러리에서 변경된 내용에 따라 반환 시간이 오래 걸릴 수 있는 차단 함수라는 것입니다. 따라서 UI 스레드에서 호출해서는 안 됩니다.
프로그램이 up-to가져온 후 변경 알림을 등록하여 현재 보기를 유지할 수 있습니다.
Shell API 알림
Windows Shell API는 SHChangeNotifyRegister 함수를 제공합니다. 이 함수는 비서비스 프로세스에서 라이브러리 변경에 대한 알림을 받을 수 있는 기본 방법입니다.
Windows Shell API를 사용하여 라이브러리 내의 항목에 대한 변경 내용을 검색하려면 SHChangeNotifyRegister 호출하여 라이브러리 폴더의 항목 변경 알림에 대한 프로그램을 등록합니다. 이 함수는 라이브러리가 변경되거나 특정 라이브러리에서만 변경된 경우 프로그램에 알릴 수 있습니다. 라이브러리가 변경되면 알림이 즉시 전송됩니다.
파일 시스템 API 알림
파일 시스템 알림은 서비스 프로세스에서 사용해야 합니다.
파일 시스템 API를 사용하여 라이브러리의 항목에 대한 변경 내용을 검색하려면 라이브러리의 폴더를 열거하고 모니터링할 각 폴더에 대해 FindFirstChangeNotification 호출합니다. 모니터링되는 폴더가 변경되면 프로그램에 알림이 표시됩니다. 폴더에서 변경된 파일의 특정 파일을 찾으려면 ReadDirectoryChangesW호출합니다. 라이브러리 설명 파일의 변경 내용을 검색하려면 해당 파일이 포함된 폴더를 모니터링합니다. 라이브러리 설명 파일은 FOLDERID_Libraries 폴더에서 찾을 수 있습니다. 그러나 라이브러리 설명 파일을 열거나 수정해서는 안 됩니다.
관련 항목