프로그램에서 라이브러리 사용

이 항목에서는 프로그램에서 라이브러리를 사용할 때 고려해야 할 몇 가지 사항에 대해 설명합니다.

항목 내용

라이브러리 프로그래밍 개요

라이브러리를 사용하면 사용자가 파일 기반 콘텐츠를 의미 있고 파일 시스템의 organization 제한되지 않는 방식으로 구성할 수 있습니다. 프로그램이 라이브러리를 지원하는 경우 사용자가 Windows 7 사용자 환경과 일치하는 사용자 인터페이스를 제시하면서 사용자에게 적합한 방식으로 콘텐츠를 찾을 수 있습니다. 또한 라이브러리를 사용하면 프로그램이 다른 폴더 또는 다른 컴퓨터에 저장된 파일 기반 콘텐츠를 더 쉽게 찾을 수 있습니다.

이 섹션의 topics 라이브러리 지원을 프로그램에 추가하고 라이브러리에서 제공하는 새로운 기능을 활용하는 방법을 설명합니다. Windows 7은 기본적으로 이러한 지원 중 일부를 제공합니다. 프로그램에서 현재 사용하는 일반 파일 대화 상자를 수정하지 않는 경우 라이브러리를 지원하기 위해 추가 프로그래밍이 거의 필요하지 않을 수 있습니다.

이 섹션에서는 라이브러리가 제공하는 몇 가지 주요 기능과 프로그램에서 라이브러리를 지원하는 방법에 대해 설명합니다. 이 정보를 사용하여 프로그램에서 최상의 사용자 환경을 제공할 기능을 결정할 수 있습니다. 프로그램에서 공통 파일 대화 상자를 사용자 지정하는 경우 이 섹션의 정보를 통해 새 일반 파일 대화 상자를 사용하여 라이브러리를 사용하고 Windows 7에서 동등한 기능을 제공하는 방법을 결정할 수 있습니다.

라이브러리를 사용한 프로그래밍

Windows Shell 프로그래밍 모델은 프로그램이 Windows Shell 프로그래밍 개체와 상호 작용하는 방법을 설명합니다. 파일 및 디렉터리와 같은 파일 시스템 개체는 Windows Shell 개체로 표시되지만 모든 Windows Shell 개체가 파일 시스템으로 표현되는 것은 아닙니다. 예를 들어 라이브러리는 파일 시스템에 해당하는 항목이 없는 Windows Shell 개체입니다. 프로그램에서 Windows Shell 개체를 사용하면 프로그램에서 파일 시스템 개체뿐만 아니라 모든 Shell 개체에 액세스할 수 있습니다.

최상의 결과를 위해 프로그램은 셸 라이브러리 API 를 사용하여 라이브러리와 상호 작용하고 해당 콘텐츠에 액세스합니다. 라이브러리에는 폴더 및 파일과 같은 파일 시스템 항목이 포함되지만 라이브러리는 파일 시스템 항목이 아닙니다. 따라서 파일 시스템 API는 라이브러리 기능 또는 라이브러리 콘텐츠에 액세스하는 데 사용할 수 없습니다.

현재 많은 파일 시스템 API를 사용하는 기존 프로그램이 있는 경우 프로그램에서 라이브러리 기능을 계속 활용할 수 있습니다. 셸 라이브러리 API는 라이브러리에 있는 항목에 대한 파일 시스템 참조를 제공할 수 있으며 파일 이름 및 경로와 같은 이러한 파일 시스템 참조를 기존 프로그램에 있는 기존 파일 시스템 API에 전달할 수 있습니다.

알려진 폴더에서 라이브러리로 이동

Windows 7 이전에는 파일 저장 또는 파일 열기 작업의 기본 폴더로 알려진 폴더(예: 내 문서 폴더)를 사용하는 것이 일반적이었습니다. Windows 7에서는 사용자가 Windows Explorer 같은 다른 Windows 7 프로그램과 동일한 환경을 사용할 수 있도록 해당 라이브러리를 사용해야 합니다.

현재 프로그램에서 Windows Shell API를 사용하는 경우 라이브러리 지원을 추가하는 것은 간단합니다. 예를 들어 현재 SHGetKnownFolderItem 함수를 호출하여 내 문서 폴더의 위치를 가져오는 경우 내 문서 알려진 폴더의 KNOWNFOLDERID 값을 해당 라이브러리의 KNOWNFOLDERID 값으로 바꿀 수 있습니다.

다음 표에서는 알려진 폴더의 KNOWNFOLDERID 값과 Windows 7에 있는 해당 라이브러리의 KNOWNFOLDERID 값 간의 관계를 보여 줍니다.

알려진 폴더 KNOWNFOLDERID 값 라이브러리 KNOWNFOLDERID 값
FOLDERID_Documents FOLDERID_DocumentsLibrary
FOLDERID_Pictures FOLDERID_PicturesLibrary
FOLDERID_Music FOLDERID_MusicLibrary
FOLDERID_RecordedTV FOLDERID_RecordedTVLibrary

 

홈 그룹 및 공유 라이브러리

프로그램에 라이브러리 지원을 추가하면 HomeGroup에서 공유 라이브러리를 지원할 수 있습니다. HomeGroup은 FOLDERID_HOMEGROUP KNOWNFOLDERID 값으로 식별됩니다. 프로그램은 IShellLibrary::GetDefaultSaveFolder 메서드 호출에서 DEFAULTSAVEFOLDERTYPE 값을 설정하여 사용자의 프라이빗 또는 공유 기본 저장 위치를 식별할 수 있습니다.

라이브러리와 함께 일반 파일 대화 상자 사용

라이브러리가 있는 일반 파일 대화 상자를 사용하여 Windows 7의 라이브러리를 지원하도록 일반 파일 대화 상자가 업데이트되었습니다. 다음 그림에서는 Windows 7의 사용자에게 일반적인 파일 대화 상자가 표시되는 방식을 보여 줍니다.

라이브러리를 보여 주는 일반 파일 대화 상자의 스크린샷

Windows 7에서 프로그램이 현재 공통 파일 대화 상자를 표시하고 대화 상자 템플릿을 변경하거나 해당 이벤트를 후크하지 않으면 새 Windows 7 버전의 대화 상자가 자동으로 표시됩니다. 특히 일반 파일 대화 상자 함수를 호출할 때 OPENFILENAME 구조체의 lpfnHook, hInstance, lpTemplatename 멤버는 NULL이어야 하며 OFN_ENABLEHOOKOFN_ENABLETEMPLATE 플래그는 명확해야 합니다.

Windows 7에서 IFileDialog 관련 인터페이스는 이전 버전의 Windows에서 사용된 일반적인 파일 대화 상자 함수를 대체합니다. 이전의 일반적인 파일 대화 상자 함수는 Windows 7에서 계속 지원되지만 완전한 Windows 7 사용자 환경을 제공하지 않으며 라이브러리를 지원하지 않습니다. IFileDialog 관련 인터페이스에서 지원하는 새로운 기능 중 일부는 다음과 같습니다.

  • 사용자는 Windows 7 Windows Explorer 지원하는 파일 속성에 액세스하여 파일을 검색하고 선택할 수 있습니다.
  • 프로그램은 셸 네임스페이스 API의 인터페이스와 메서드를 사용하여 항목을 사용할 수 있습니다.
  • 프로그램은 리소스 파일 기반 사용자 지정 모델 대신 데이터 기반 사용자 지정 모델을 사용하여 일반 파일 대화 상자에 새 컨트롤을 추가할 수 있습니다.

다음과 같은 경우 IFileDialog 관련 인터페이스를 사용해야 합니다.

  • Windows 7에서 프로그램의 일반 파일 대화 상자를 사용자 지정해야 합니다. 이렇게 하면 프로그램이 라이브러리와 함께 작동하고 대화 상자 사용자 지정을 지원할 수 있습니다.
  • 사용자가 공통 파일 대화 상자에서 여러 파일을 선택할 수 있도록 합니다. 이렇게 하면 라이브러리에 다른 폴더에 저장된 콘텐츠가 있을 수 있으므로 선택한 개체에 대한 올바른 경로를 얻을 수 있습니다.

IFileDialog 관련 인터페이스에 대한 자세한 내용은 다음을 참조하세요.

사용자 인터페이스에서 라이브러리 선택 사용

프로그램에서 사용자가 Windows 7에서 가져오기 또는 내보내기 함수와 같은 폴더를 선택할 수 있도록 허용하는 경우 사용자가 라이브러리도 선택할 수 있도록 허용해야 합니다. IFileOpenDialog 인터페이스 및 SHBrowseForFolder 함수를 사용하면 폴더를 선택하라는 메시지가 표시되면 사용자가 라이브러리를 선택할 수 있습니다. IFileOpenDialog는 Windows 7 사용자 인터페이스를 지원하므로 SHBrowseForFolder 함수보다 IFileOpenDialog 인터페이스를 사용하는 것이 좋습니다.

사용자가 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와 함께 사용할 수 있습니다. 예를 들어 프로그램에서 IShellItemIShellFolder 인터페이스를 관련 도우미 함수와 함께 사용하여 폴더 및 폴더 콘텐츠를 열거하여 파일 시스템 API를 사용하여 콘텐츠에 액세스하는 것과 같은 방식으로 라이브러리의 콘텐츠에 액세스할 수 있습니다.

Windows 셸 API는 라이브러리의 내용에 액세스하는 두 개의 열거형 모드를 지원합니다.

  • 찾아보기 열거형

    찾아보기 열거형은 기본 열거형 모드이며 라이브러리 폴더의 내용을 열거합니다. SHCONTF_NAVIGATION_ENUM 플래그를 지워 이 모드를 사용합니다.

  • 탐색 열거형

    탐색 열거형은 라이브러리 폴더를 열거합니다. 이 모드를 사용하도록 SHCONTF_NAVIGATION_ENUM 플래그를 설정합니다.

프로그램에서 사용자 지정 트리 컨트롤을 사용하여 사용자의 폴더를 탐색하는 경우 탐색 열거 모드에서 폴더를 열거하면 Windows Explorer Windows 7의 폴더를 열거하는 방법과 일치하는 라이브러리 폴더 목록이 제공됩니다.

프로그램에서 이러한 기능을 사용하는 방법에 대한 예제는 Windows SDK의 ShellStorage 샘플을 참조하세요.

라이브러리에 사용자 콘텐츠 저장

프로그램에서 라이브러리와 라이브러리의 폴더에 사용자 콘텐츠를 저장할 수 있습니다. 마찬가지로 사용자는 라이브러리의 특정 폴더에 저장하거나 라이브러리에 저장할 수 있습니다.

모든 라이브러리에는 기본 저장 위치로 지정된 폴더가 있습니다. 기본 저장 위치는 라이브러리를 만들 때 정의됩니다. 그러나 사용자는 기본 저장 위치를 라이브러리의 모든 폴더로 다시 할당할 수 있습니다. 사용자가 기본 저장 위치를 구성할 필요는 없지만 변경할 수 있는 옵션이 있습니다. 사용자가 현재 기본 저장 위치로 설정된 폴더를 삭제하면 라이브러리는 라이브러리의 다음 폴더를 기본 저장 위치로 자동으로 구성합니다.

라이브러리에 사용자 콘텐츠를 저장할 수 있는 여러 가지 방법이 있습니다.

  • 셸 API

    셸 프로그래밍 모델을 사용하고 IShellItem, IStorage 또는 IStream으로 표시되는 셸 항목을 라이브러리 개체에 저장하는 경우 셸 항목은 라이브러리의 기본 저장 위치에 자동으로 저장됩니다.

  • 파일 시스템 API

    많은 파일 시스템 API 호출을 사용하는 기존 프로그램이 있는 경우 라이브러리의 기본 저장 위치로 정의된 폴더의 경로를 가져올 수 있습니다. 그런 다음 폴더 경로를 파일 시스템 API에 전달할 수 있습니다.

프로그램에서 이러한 기능을 사용하는 방법에 대한 예제는 Windows SDK의 ShellStorage 샘플을 참조하세요.

라이브러리에서 끌어서 놓기 작업 지원

프로그램에서 끌어서 놓기 작업을 지원하는 경우 올바른 라이브러리 상호 작용을 지원하도록 업데이트해야 합니다. 파일이 라이브러리에 삭제되면 삭제된 파일을 기본 저장 위치에 저장해야 합니다. 폴더를 라이브러리에 놓으면 삭제된 폴더를 라이브러리에 새 폴더로 추가해야 합니다. 파일이 기본 저장 위치가 아닌 기존 폴더에 놓이면 선택한 폴더에 파일을 추가해야 합니다.

프로그램 끌어서 놓기 기능에 대한 라이브러리 지원을 추가하는 방법에 대한 예제는 Windows SDK의 ShellLibraryCommandLine 샘플을 참조하세요.

라이브러리와 동기화 유지

이 항목에서는 프로그램이 라이브러리의 콘텐츠를 최신 상태로 유지하는 방법을 설명합니다.

대량 업데이트

프로그램이 실행되고 있지 않을 때 사용자가 라이브러리의 폴더를 대화형으로 수정할 수 있으므로 프로그램이 라이브러리의 변경 내용을 검색하고 저장하기 시작할 때 SHResolveLibrary 를 호출해야 합니다. Shell API는 프로그램이 라이브러리의 현재 콘텐츠와 라이브러리에 포함될 수 있는 폴더의 현재 위치를 가져올 수 있도록 SHResolveLibrary 함수를 제공합니다.

SHResolveLibrary는 라이브러리에서 변경된 내용에 따라 반환하는 데 시간이 오래 걸릴 수 있는 차단 함수입니다. 따라서 UI 스레드에서 호출하면 안 됩니다.

프로그램이 최신 상태로 유지되면 변경 알림을 등록하여 현재 보기를 유지할 수 있습니다.

셸 API 알림

Windows 셸 API는 SHChangeNotifyRegister 함수를 제공합니다. 이 함수는 서비스 이외의 프로세스에서 라이브러리의 변경 내용에 대한 알림을 받을 수 있는 기본 방법입니다.

Windows 셸 API를 사용하여 라이브러리 내의 항목에 대한 변경 내용을 검색하려면 SHChangeNotifyRegister 를 호출하여 라이브러리 폴더의 항목에 대한 변경 알림에 대한 프로그램을 등록합니다. 이 함수는 라이브러리 또는 특정 라이브러리에 변경 사항이 있는 경우 프로그램에 알릴 수 있습니다. 라이브러리가 변경되면 알림이 즉시 전송됩니다.

파일 시스템 API 알림

파일 시스템 알림은 서비스 프로세스에서 사용해야 합니다.

파일 시스템 API를 사용하여 라이브러리의 항목에 대한 변경 내용을 검색하려면 라이브러리의 폴더를 열거하고 모니터링할 각 폴더에 대해 FindFirstChangeNotification 을 호출합니다. 모니터링되는 폴더가 변경되면 프로그램에서 알림을 받게 됩니다. 폴더에서 변경된 파일의 특정 파일을 찾으려면 ReadDirectoryChangesW를 호출합니다. 라이브러리 설명 파일의 변경 내용을 검색하려면 라이브러리 설명 파일이 포함된 폴더를 모니터링합니다. 라이브러리 설명 파일은 FOLDERID_Libraries 폴더에서 찾을 수 있습니다. 그러나 라이브러리 설명 파일은 열거나 수정해서는 안 됩니다.

라이브러리 정보

IShellLibrary

셸 링크

알려진 폴더

라이브러리 설명 스키마

IID_PPV_ARGS