편집

다음을 통해 공유


속성 처리기 모범 사례 및 FAQ

이 항목에서는 Windows 속성 시스템에서 작동하도록 속성 처리기를 만들고 등록하는 방법을 설명합니다.

이 항목은 다음과 같이 구성됩니다.

모범 사례

파일 시스템 속성 재정의

파일에 대한 일부 속성은 다음과 같은 파일 시스템 데이터 원본에서 제공됩니다.

  • PKEY_FileName
  • PKEY_Extension
  • PKEY_ModifiedTime

일반적으로 속성 처리기는 이러한 속성에 대한 값을 제공할 수 없습니다. 그러나 경우에 따라 이러한 속성은 속성 처리기에서 제공하는 등록 정보에 따라 재정의될 수 있습니다. 속성 처리기는 HKEY_CLASSES_ROOT\CLSID\{handler clsid}\OverrideFileSystemProperties 를 재정의하려는 속성 이름으로 채웁니다. 이는 시스템에 지식이 있는 다음 목록에 표시된 고정된 속성 집합으로 제한됩니다.

재정의는 다음 속성 값에 대해 지원됩니다.

모든 셸 속성의 전체 목록은 셸 속성을 참조하세요.

중요

재정의된 속성 값은 파일이 인덱싱될 때만 사용됩니다. 따라서 파일 시스템 데이터 원본에서 파일을 검색해도 재정의된 값이 표시되지 않습니다.  

XML 기반 파일 형식으로 속성 저장

XML 기반 파일 형식으로 속성을 저장하는 데 사용할 수 있는 두 가지 기본 옵션이 있습니다.

  • 문서의 XML 스키마에 따라 XML 요소 및 특성을 사용하여 각 속성을 저장합니다. 이 방법은 더 "XML 친화적"입니다.
  • 전체 속성 저장소를 메모리 BLOB(Binary Large Object)로 직렬화하고, BLOB을 base64로 인코딩된 문자열로 변환한 다음, 해당 문자열을 XML에 저장합니다. 이는 두 가지 방법 중 더 간단하며 열려 있는 메타데이터에 대한 지원을 제공하는 데 사용할 수 있습니다.

예를 들어 일부 처리기는 이러한 접근 방식을 결합하여 몇 가지 중요한 값을 표준 XML 형식으로 저장하고 나머지는 BLOB에 저장할 수 있습니다.

계산된 속성

일부 속성은 파일의 특정 특성에서 파생됩니다. 예를 들어 System.Image.Dimensions 속성은 이미지 파일에서 이미지의 실제 차원에 따라 결정됩니다. 이러한 속성 값은 속성 처리기에서 변경할 수 없으므로 속성 설명에 표시됩니다 isInnate="true" . 다른 속성은 특정 속성의 일부에서 계산되거나 여러 속성의 값을 집계하여 계산됩니다. 이러한 "계산된" 속성에 대한 업데이트는 "원본" 값을 변경하는 방법에 대한 모호성을 만들므로 계산 속성은 속성 설명에 표시 isInnate="true" 되거나 읽기 전용으로 보고되어야 합니다. 후자의 옵션은 처리기에 IPropertyStoreCapabilities::IsPropertyWritable에서 S_FALSE 반환하도록 지시하여 사용할 수 있습니다.

질문과 대답

Windows Search 인덱서에서 내 속성 처리기가 로드되지 않는 이유는 무엇인가요?

Windows Search 인덱서는 시스템 서비스로 실행되며 사용자 프로필 디렉터리에 저장된 DLL을 로드할 수 없습니다. Microsoft Visual Studio를 사용하여 빌드하고 디버깅하는 경우 DLL을 사용자 프로필에 배치하므로 인덱서에서 로드되지 않습니다. 이 작업을 해결하려면 프로필 폴더 외부(예 : C:\Program Files\YourAppName)에 DLL을 복사하여 등록합니다.

Windows Search 인덱서에서 작동하도록 속성 처리기를 개발하는 방법에 대한 자세한 지침은 Windows Search용 속성 처리기 개발을 참조하세요.

'IPropertyStore::GetCount' 및 'IPropertyStore::GetAt' 열거형 메서드를 통해 검색할 수 있는 속성은 무엇입니까?

속성 저장소 개체의 모든 클라이언트가 이러한 메서드를 사용하는 것은 아닙니다. 일부 클라이언트는 PKEY 이름으로 직접 요청하거나 속성 설명 목록을 통해 속성 정보를 수신하려는 속성을 알고 있습니다. 속성 검색 메서드는 다른 여러 시나리오를 대체합니다. 속성이 이러한 시나리오에 참여할 필요가 없는 경우 열거할 필요가 없습니다. 따라서 속성 처리기는 IPropertyStore::GetCount 및 IPropertyStore::GetAt 메서드를 통해 검색되지 않는 속성에 대해 VT_EMPTY 이외의 값을 생성할 수 있습니다.

그러나 다음 조건이 충족되는 경우 이러한 메서드를 통해 속성을 표시해야 합니다.

  • 속성을 검색할 수 있도록 인덱싱된 경우: 즉, Windows Search 속성 저장소(속성 설명 스키마에서 로 표시 isColumn = "true" 됨)에 포함되거나 전체 텍스트 검색(inInvertedIndex = "true")에 사용할 수 있습니다. 이러한 플래그가 없거나 속성 설명이 없는 경우 검색을 사용하도록 설정하기 위해 "string" 형식의 속성이 반전된 인덱스로 자동으로 추가됩니다. 속성 시스템의 알려진 속성 목록(설치된 속성 설명이 있는 속성)은 매우 크므로(800개 이상의 속성) 속성 시스템에 등록된 모든 속성에 대해 모든 속성 처리기를 요청하는 것은 비현실적입니다. 대신 인덱싱 프로세스는 인덱싱하는 각 항목에 대한 속성 처리기의 관련 속성을 열거하고 열거된 속성의 값을 사용하여 전체 텍스트 인덱스를 작성합니다.
  • 항목의 속성 집합이 중복될 때 속성을 복사해야 하는 경우: "속성 집합 복사" 함수를 구현하기 위해 원본 항목은 IPropertyStore::GetCount 및 IPropertyStore::GetAt 메서드를 통해 복사해야 하는 속성을 표시합니다. 복사할 필요가 없거나 복사하는 것이 타당하지 않은 속성은 포함되지 않아야 합니다.
  • 속성 값이 비어 있지 않으면(VT_EMPTY): 비어 있는 속성 값은 클라이언트에 유용하지 않습니다. 클라이언트가 빈 속성 값을 반환하려고 하면 VT_EMPTY 값이 반환됩니다. 따라서 빈 값이 있는 속성은 열거해서는 안 됩니다.
  • "속성 제거" 함수를 호출할 때 속성을 제거해야 하는 경우: 이 기능은 개인 정보를 보호하기 위해 존재합니다. 열거형을 통해 속성 처리기에서 모든 값을 검색하고 사용자가 제거하기 위해 선택한 각 값을 제거합니다.

참고

속성 열거형은 처리기가 고정된 스키마를 지원하는 경우 특정 속성 처리기가 지원하는 속성 집합을 전달하지 않으며 메타데이터를 열지 않습니다. 대신 이러한 처리기는 지원하는 속성 집합을 문서화해야 합니다.

 

열려 있는 메타데이터를 지원하는 파일 형식을 알고 어떻게 할까요??

열려 있는 메타데이터 지원에 대한 자세한 내용은 파일 형식의 "열기 메타데이터를 지원하는 파일 형식"을 참조하세요.

속성 처리기를 사용하여 VT_NULL 값을 저장할 수 있나요?

아니요. VT_NULL 값은 IPropertyStore::GetValue 및 IPropertyStore::SetValue 호출 시 VT_EMPTY 변환됩니다.

'PropVariantChangeType' 함수에서 지원되는 날짜 문자열 형식은 무엇입니까?

일반적으로 날짜/시간 값을 나타내는 속성은 VT_FILETIME 사용하여 표현되어야 합니다. 그러나 많은 데이터 원본은 이 정보를 문자열 형식으로 제공합니다. PropVariantChangeType 도우미 API는 다음 표와 같이 일부 문자열 날짜 형식을 FILETIME 값으로 강제 변환하는 것을 지원합니다.

서식 Windows Vista, Windows XP 및 Microsoft WDS(Windows Desktop Search) Windows 7 참고
yyyy/mm/dd:hh:mm:ss.uuu Yes Yes Utc; y=year, m=month, d=date, h=hours(24시간 클록), m=분, s=초, u=microseconds
yyyy-mm-ddThh:mm:ssZ 아니요 ISO8601 형식 사양 UTC('Z' 표준 시간대 표시기로 표시됨); y=year, m=month, d=date, h=hours(24시간 클록), m=분, s=초; 'T'는 시간 부분에 대한 구분 기호입니다.

읽기 전용 속성 처리기를 만들 수 있나요?

예. 일부 속성 처리기 구현은 속성 값 작성을 지원하지 않습니다. 이러한 속성 처리기는 STGM_READWRITE 전달하는 IInitializeXXX::Initialize 호출 또는 IPropertyStore::SetValue 호출 시 STGM_E_ACCESSDENIED 반환해야 합니다.

STGM_READ 모드에서 열린 모든 속성 처리기는 IPropertyStore::SetValue 호출 시 STGM_E_ACCESSDENIED 반환해야 합니다.

스키마가 속성을 쓸 수 있음을 나타내는 경우에도 속성 처리기가 속성을 읽기 전용으로 처리할 수 있나요?

예. 스키마 시스템에서 속성은 읽기 전용(가 있는 속성 포함 isInnate = "true") 또는 읽기/쓰기로 주석이 추가됩니다. 스키마가 쓰기 가능해야 한다고 말하는 특정 속성 작성을 지원하지 않는 속성 처리기는 IPropertyStoreCapabilities를 구현하고 해당 속성에 대한 IPropertyStoreCapabilities::IsPropertyWritable 호출 시 S_FALSE 반환해야 합니다. 이는 이 처리기와 이 파일의 컨텍스트에서 속성을 쓸 수 없음을 나타냅니다.

참고

역방향 작업은 불가능합니다. 속성 처리기가 스키마에서 읽기 전용으로 표시된 속성을 쓰도록 설정할 수 없습니다.