속성 처리기 등록 및 배포

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

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

속성 처리기 등록 및 배포

속성 처리기를 구현한 후에는 등록해야 하며 해당 파일 이름 확장명은 처리기와 연결되어야 합니다. .recipe 확장을 사용하는 다음 예제에서는 필요한 레지스트리 항목을 보여 줍니다.

HKEY_CLASSES_ROOT
   CLSID
      {50d9450f-2a80-4f08-93b9-2eb526477d1a}
         (Default) = Recipe Property Handler
         ManualSafeSave [REG_DWORD] = 00000001
         InProcServer32
            (Default) = C:\\SDK\\PropertyHandlerSample\\bin\\RecipeHandlers.dll
            ThreadingModel = Apartment
HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows
            CurrentVersion
               PropertySystem
                  PropertyHandlers
                     .recipe
                        (Default) = {50d9450f-2a80-4f08-93b9-2eb526477d1a}

특정 파일 형식에 대한 속성 처리기는 일반적으로 해당 형식의 파일을 만들거나 조작하는 애플리케이션과 함께 배포됩니다. 그러나 속성 처리기가 인덱서에서 사용되지만 함께 제공되는 애플리케이션이 필요하지 않은 서버 시나리오에서 파일 형식의 인덱싱을 지원하기 위해 이러한 애플리케이션과 독립적으로 속성 처리기를 사용할 수 있도록 하는 것도 고려해야 합니다. 속성 처리기에 대한 독립 실행형 설치 패키지를 만드는 경우 다음이 포함되어 있는지 확인합니다.

  • 속성 처리기 등록 및 배포 항목에 지정된 속성 처리기 등록 세부 정보입니다.
  • 클라이언트가 속성 처리기의 모든 기능에 액세스할 수 있도록 파일 형식 및 설치해야 하는 스키마 파일에 대한 등록입니다.

속성 처리기에 대한 성능 및 안정성 고려 사항

속성 처리기는 특정 컴퓨터의 각 파일에 대해 호출됩니다. 일반적으로 다음과 같은 상황에서 호출됩니다.

  • 파일을 인덱싱하는 동안 이 작업은 제한된 권한이 있는 격리된 프로세스에서 Out-of-process로 수행됩니다.
  • Windows에서 파일에 액세스하는 경우 속성 값을 읽고 쓰기 위해 Explorer. 이 작업은 프로세스에서 수행됩니다.

성능 및 안정성에 대한 지침

언제든지 사용자는 자신의 컴퓨터에 특정 형식(사용자 포함)의 수만 개의 파일을 가질 수 있으며 언제든지 이러한 파일 중 어느 또는 전부에 액세스하거나 수정할 수 있습니다. 이러한 액세스 및 수정 작업을 지원하기 위해 속성 처리기가 자주 호출되기 때문에 사용량이 많은 동시 환경에서 속성 처리기의 성능 및 안정성 특성은 매우 중요합니다.

속성 처리기를 개발하고 테스트할 때 다음 지침에 유의하세요.

  • 속성 열거형

    속성 처리기는 속성을 열거하는 데 매우 빠른 응답 시간이 있어야 합니다. 빠른 응답 시간을 보장하려면 속성 값, 네트워크 조회 또는 파일 자체 이외의 리소스 검색에 대한 메모리 집약적 계산을 피해야 합니다.

  • 현재 위치 속성 쓰기

    가능한 경우 중형 또는 대용량 파일(수백 KB 이상)을 처리할 때 속성 값을 읽거나 쓸 때 디스크에서 전체 파일을 읽을 필요가 없도록 파일 형식을 정렬해야 합니다. 파일을 찾아야 하는 경우에도 이러한 파일에 액세스하거나 인덱싱하려고 할 때 Windows Explorer 또는 Windows Search 인덱서의 작업 집합이 부풀어 오르기 때문에 전체 메모리로 읽어서는 안 됩니다. 자세한 내용은 속성 처리기 초기화를 참조하세요.

    이 작업을 수행하는 한 가지 유용한 방법은 파일의 헤더를 추가 공간으로 패딩하여 다음에 속성 값을 작성해야 할 때 전체 파일을 다시 작성하지 않고도 값을 작성할 수 있도록 하는 것입니다. 이를 위해서는 ManualSafeSave 기능이 필요합니다. 이 방법은 쓰기가 진행되는 동안(시스템 충돌 또는 전원 손실로 인해) 파일 쓰기 작업이 중단될 수 있는 몇 가지 추가 위험을 수반하지만 속성 크기가 일반적으로 작기 때문에 이러한 중단의 확률은 비슷하게 적으며 현재 위치 속성 쓰기를 통해 실현할 수 있는 성능 향상은 이 추가 위험을 정당화할 수 있을 만큼 충분히 중요한 것으로 간주됩니다. 그럼에도 불구하고 쓰기 작업 과정에서 오류가 발생하는 경우 파일이 손상되지 않도록 구현을 광범위하게 테스트해야 합니다.

    마지막으로 ManualSafeSave를 사용하여 현재 위치 속성 쓰기를 구현할 때 작업을 현재 위치에서 수행할 수 없고 전체 스트림을 다시 작성해야 하는 경우가 있습니다. 다시 쓰기를 용이하게 하기 위해 처리기 초기화 중에 제공되는 스트림은 IDestinationStreamFactory 인터페이스를 지원합니다. IDestinationStreamFactory 인터페이스를 사용하면 처리기 구현에서 쓰기를 위한 임시 스트림을 가져올 수 있습니다. 모든 쓰기가 완료되고 IDestinationStreamFactory::GetDestinationStream 메서드가 호출되면 이 스트림은 원래 파일 스트림을 완전히 바꾸는 데 사용됩니다. 대상 스트림을 사용하는 경우 원래 파일 스트림은 IDestinationStreamFactory::GetDestinationStream 메서드가 호출된 후 대상 스트림으로 대체되므로 읽기 전용으로 처리되어야 합니다.

  • COM 스레딩 모델 선택

    속성 처리기의 효율성을 최대화하려면 COM 스레딩 모델 Both를 사용하도록 지정해야 합니다. 이를 통해 STA 아파트(예: Windows Explorer) 및 MTA(메시지 전송 에이전트) 아파트(예: Windows Search의 SearchProtocolHost 프로세스)에서 직접 액세스할 수 있으므로 이러한 환경에서 마샬링하는 오버헤드를 방지할 수 있습니다. 스레딩 모델의 모든 이점을 Both 얻으려면 해당 구성 요소에 대한 호출에서 마샬링을 방지하기 위해 처리기가 의존하는 모든 서비스도 로 Both 지정해야 합니다. 이러한 특정 서비스의 설명서를 확인하여 이 스레딩 모델을 사용하는지 확인합니다.

  • 속성 처리기 동시성

    속성 처리기 및 IPropertyStore 인터페이스는 동시 액세스가 아닌 직렬용으로 설계되었습니다. Windows Explorer, Windows Search 인덱서 및 Windows 코드베이스의 다른 모든 속성 처리기 호출은 이 사용을 보장합니다. 제3자가 속성 처리기를 동시에 사용할 이유가 없어야 하지만 이 동작을 보장할 수는 없습니다. 또한 호출 패턴이 직렬로 예상되더라도 호출은 서로 다른 스레드에서 올 수 있습니다(instance 경우 개체가 COM RPC를 통해 원격으로 호출되는 경우 인덱서에서 발생). 따라서 속성 처리기 구현은 다른 스레드에서 호출되는 것을 지원해야 하며, 동시에 호출될 때 아픈 영향을 받지 않아야 합니다. 의도된 호출 패턴은 직렬이므로 중요한 섹션을 사용하는 간단한 구현은 대부분의 경우 이러한 요구 사항을 충족하기에 충분해야 합니다. TryEnterCriticalSection 함수를 사용하여 동시 호출을 검색하고 실패하여 동시 호출에 대한 차단을 방지할 수 있습니다.

  • 파일 동시성

    속성 처리기는 여러 애플리케이션이 동시에 파일에 액세스하는 시나리오에서 자주 사용됩니다. 따라서 처리기와 애플리케이션은 파일을 열 때 적절한 공유 모드를 지정하여 동시성을 관리해야 합니다. 또한 다른 애플리케이션이 지정하는 액세스와 액세스가 허용되지 않는 경우를 관리해야 합니다. 모든 소비자가 다른 사용자가 동시에 파일에 액세스할 수 있도록 자유로운 공유 모드를 지정하는 것이 가장 좋지만, 이렇게 할 때 일관성 문제를 관리해야 합니다. 사용할 가장 적절한 공유 모드에 대한 결정은 파일에 액세스하는 애플리케이션 커뮤니티의 컨텍스트에서 이루어져야 합니다.

    파일 시스템을 사용하면 애플리케이션에서 다른 애플리케이션이 파일을 열 수 있는지 여부와 방법을 제어할 수 있는 방식으로 파일을 열 수 있습니다. 공유 모드를 사용하면 읽기, 쓰기 및 삭제 액세스가 가능합니다. 속성 시스템은 다음 표에 설명된 이러한 공유 모드의 하위 집합을 지원합니다.

    액세스 모드 공유 모드
    쓰기 다른 독자 및 작성자 거부
    쓰기(EnableShareDenyWrite) 다른 판독기 사용, 다른 작성기 거부
    읽기 전용(기본값) 다른 판독기 사용, 다른 작성기 거부
    읽기 전용(EnableShareDenyNone) 다른 판독기 및 작성기 사용

     

    쓰기(GPS_READWRITE)를 위해 열려 있는 속성 처리기는 다른 판독기와 작성기를 거부합니다. 처리기는 등록에서 플래그(읽기 사용)를 지정하여 EnableShareDenyWrite 판독기를 사용하도록 설정하는 동작을 옵트인할 수 있습니다.

    속성 처리기는 읽기 (GPS_DEFAULT)를 위해 열리고, 기본적으로 다른 판독기를 사용하도록 설정하지만 다른 기록기를 거부합니다. 처리기는 등록에서 플래그를 지정하여 EnableShareDenyNone 다른 작성기를 사용하도록 선택할 수 있습니다. 즉, 처리기는 처리기가 파일을 읽는 동안 파일 내용이 변경되는 상황을 처리할 수 있습니다.

    플래그 정의는 GETPROPERTYSTOREFLAGS를 참조하세요.

속성 처리기 이해

종류 이름 사용

속성 목록 사용

속성 처리기 초기화

속성 처리기 모범 사례 및 FAQ