메타데이터 확장성 개요
이 항목에서는 메타데이터 판독기와 작성기를 포함하여 WIC(Windows 이미징 구성 요소)에 대한 사용자 지정 메타데이터 처리기를 만들기 위한 요구 사항을 소개합니다. 또한 사용자 지정 메타데이터 처리기를 포함하도록 WIC 런타임 구성 요소 검색을 확장하기 위한 요구 사항에 대해서도 설명합니다.
이 항목에는 다음과 같은 섹션이 포함되어 있습니다.
사전 요구 사항
이 항목을 이해하려면 WIC, 해당 구성 요소 및 이미지에 대한 메타데이터를 심층적으로 이해해야 합니다. WIC 메타데이터에 대한 자세한 내용은 WIC 메타데이터 개요를 참조하세요. WIC 구성 요소에 대한 자세한 내용은 Windows 이미징 구성 요소 개요를 참조하세요.
소개
WIC 메타데이터 개요에서 설명한 것처럼 이미지 내에 여러 메타데이터 블록이 있는 경우가 많으며, 각 블록은 서로 다른 메타데이터 형식으로 다양한 유형의 정보를 노출합니다. 이미지 내에 포함된 메타데이터 형식과 상호 작용하려면 애플리케이션에서 적절한 메타데이터 처리기를 사용해야 합니다. WIC는 Exif 또는 XMP와 같은 특정 형식의 메타데이터를 읽고 쓸 수 있는 여러 메타데이터 처리기(메타데이터 판독기와 작성기 모두)를 제공합니다.
WIC는 제공된 네이티브 처리기 외에도 WIC의 런타임 구성 요소 검색에 참여하는 새 메타데이터 처리기를 만들 수 있는 API를 제공합니다. 이렇게 하면 WIC를 사용하는 애플리케이션에서 사용자 지정 메타데이터 형식을 읽고 쓸 수 있습니다.
다음 단계를 통해 메타데이터 처리기가 WIC의 런타임 메타데이터 검색에 참여할 수 있습니다.
- 사용자 지정 메타데이터 형식을 읽는 데 필요한 WIC 인터페이스를 노출하는 메타데이터 판독기 처리기 클래스(IWICMetadataReader)를 구현합니다. 이렇게 하면 WIC 기반 애플리케이션이 네이티브 메타데이터 형식을 읽는 것과 동일한 방식으로 메타데이터 형식을 읽을 수 있습니다.
- 사용자 지정 메타데이터 형식을 인코딩하는 데 필요한 WIC 인터페이스를 노출하는 메타데이터 작성기 처리기 클래스(IWICMetadataWriter)를 구현합니다. 이렇게 하면 WIC 기반 애플리케이션이 메타데이터 형식을 지원되는 이미지 형식으로 직렬화할 수 있습니다.
- 메타데이터 처리기를 디지털 서명하고 등록합니다. 이렇게 하면 레지스트리의 식별 패턴을 이미지 파일에 포함된 패턴과 일치시켜 런타임에 메타데이터 처리기를 검색할 수 있습니다.
메타데이터 판독기 만들기
코덱 내의 메타데이터 블록에 대한 기본 액세스는 각 WIC 코덱이 구현하는 IWICMetadataBlockReader 인터페이스를 통해 이루어집니다. 이 인터페이스는 각 블록에 대해 적절한 메타데이터 처리기를 검색하고 인스턴스화할 수 있도록 이미지 형식에 포함된 각 메타데이터 블록을 열거합니다. WIC에서 인식되지 않는 메타데이터 블록은 알 수 없는 것으로 간주되며 GUID CLSID_WICUnknownMetadataReader 정의됩니다. WIC에서 메타데이터 형식을 인식하려면 IWICMetadataReader, IWICPersistStream 및 IWICStreamProvider의 세 가지 인터페이스를 구현하는 클래스를 만들어야 합니다.
참고
메타데이터 형식에 필요한 인터페이스의 일부 메서드를 부적절하게 렌더링하는 제한이 있는 경우 이러한 메서드는 WINCODEC_ERR_UNSUPPORTEDOPERATION 반환해야 합니다.
IWICMetadataReader 인터페이스
메타데이터 판독기를 만들 때 IWICMetadataReader 인터페이스를 구현해야 합니다. 이 인터페이스는 메타데이터 형식의 데이터 스트림 내에서 언더링되는 메타데이터 항목에 대한 액세스를 제공합니다.
다음 코드는 wincodecsdk.idl 파일에 정의된 메타데이터 판독기 인터페이스의 정의를 보여 줍니다.
interface IWICMetadataReader : IUnknown
{
HRESULT GetMetadataFormat(
[out] GUID *pguidMetadataFormat
);
HRESULT GetMetadataHandlerInfo(
[out] IWICMetadataHandlerInfo **ppIHandler
);
HRESULT GetCount(
[out] UINT *pcCount
);
HRESULT GetValueByIndex(
[in] UINT nIndex,
[in, out, unique] PROPVARIANT *pvarSchema,
[in, out, unique] PROPVARIANT *pvarId,
[in, out, unique] PROPVARIANT *pvarValue
);
HRESULT GetValue(
[in, unique] const PROPVARIANT *pvarSchema,
[in] const PROPVARIANT *pvarId,
[in, out, unique] PROPVARIANT *pvarValue
);
HRESULT GetEnumerator(
[out] IWICEnumMetadataItem **ppIEnumMetadata
);
};
GetMetadataFormat 메서드는 메타데이터 형식의 GUID를 반환합니다.
GetMetadataHandlerInfo 메서드는 메타데이터 처리기에 대한 정보를 제공하는 IWICMetadataHandlerInfo 인터페이스를 반환합니다. 여기에는 메타데이터 형식을 지원하는 이미지 형식 및 메타데이터 판독기가 전체 메타데이터 스트림에 액세스해야 하는지 여부와 같은 정보가 포함됩니다.
GetCount 메서드는 메타데이터 스트림 내에 있는 개별 메타데이터 항목(포함된 메타데이터 블록 포함)의 수를 반환합니다.
GetValueByIndex 메서드는 인덱스 값으로 메타데이터 항목을 반환합니다. 이 메서드를 사용하면 애플리케이션이 메타데이터 블록의 각 메타데이터 항목을 반복할 수 있습니다. 다음 코드에서는 애플리케이션이 이 메서드를 사용하여 메타데이터 블록의 각 메타데이터 항목을 검색하는 방법을 보여 줍니다.
PROPVARIANT readerValue;
IWICMetadataBlockReader *blockReader = NULL;
IWICMetadataReader *reader = NULL;
PropVariantInit(&readerValue);
hr = pFrameDecode->QueryInterface(IID_IWICMetadataBlockReader, (void**)&blockReader);
if (SUCCEEDED(hr))
{
// Retrieve the third block in the image. This is image specific and
// ideally you should call this by retrieving the reader count
// first.
hr = blockReader->GetReaderByIndex(2, &reader);
}
if (SUCCEEDED(hr))
{
UINT numValues = 0;
hr = reader->GetCount(&numValues);
// Loop through each item and retrieve by index
for (UINT i = 0; SUCCEEDED(hr) && i < numValues; i++)
{
PROPVARIANT id, value;
PropVariantInit(&id);
PropVariantInit(&value);
hr = reader->GetValueByIndex(i, NULL, &id, &value);
if (SUCCEEDED(hr))
{
// Do something with the metadata item.
//...
}
PropVariantClear(&id);
PropVariantClear(&value);
}
}
GetValue 메서드는 스키마 및/또는 ID별로 특정 메타데이터 항목을 검색합니다. 이 메서드는 특정 스키마 또는 ID가 있는 메타데이터 항목을 검색한다는 점을 제외하고 GetValueByIndex 메서드와 유사합니다.
GetEnumerator 메서드는 메타데이터 블록에 있는 각 메타데이터 항목의 열거자를 반환합니다. 이렇게 하면 애플리케이션에서 열거자를 사용하여 메타데이터 형식을 탐색할 수 있습니다.
메타데이터 형식에 메타데이터 항목에 대한 스키마 개념이 없는 경우 GetValue... 메서드는 이 속성을 무시해야 합니다. 그러나 형식이 스키마 명명을 지원하는 경우 NULL 값을 예상해야 합니다.
메타데이터 항목이 포함된 메타데이터 블록인 경우 포함된 콘텐츠의 하위 스트림에서 메타데이터 처리기를 만들고 새 메타데이터 처리기를 반환합니다. 중첩된 블록에 사용할 수 있는 메타데이터 판독기가 없는 경우 알 수 없는 메타데이터 판독기를 인스턴스화하고 반환합니다. 포함된 블록에 대한 새 메타데이터 판독기를 만들려면 구성 요소 팩터리의 CreateMetadataReaderFromContainer 또는 CreateMetadataReader 메서드를 호출하거나 WICMatchMetadataContent 함수를 호출합니다.
메타데이터 스트림에 big-endian 콘텐츠가 포함된 경우 메타데이터 판독기는 처리하는 모든 데이터 값을 교환할 책임이 있습니다. 또한 중첩된 메타데이터 판독기에게 빅 엔드리안 데이터 스트림으로 작업하고 있음을 알릴 책임이 있습니다. 그러나 모든 값은 little-endian 형식으로 반환되어야 합니다.
메타데이터 항목 ID가 메타데이터 형식에 해당하는 (GUID)인 쿼리를 VT_CLSID
지원하여 네임스페이스 탐색에 대한 지원을 구현합니다. 구문 분석 중에 해당 형식에 대한 중첩된 메타데이터 판독기가 식별되면 반환되어야 합니다. 이를 통해 애플리케이션은 메타데이터 쿼리 판독기를 사용하여 메타데이터 형식을 검색할 수 있습니다.
ID로 메타데이터 항목을 가져오는 경우 PropVariantChangeType 함수 를 사용하여 ID를 예상 형식으로 강제 변환해야 합니다. 예를 들어 IFD 판독기는 IFD 태그 ID USHORT의 데이터 형식과 일치하도록 ID를 형식 VT_UI2
으로 강제 변환합니다. 이렇게 하려면 입력 형식과 예상 형식이 모두 PROPVARIANT 여야 합니다. 필수는 아니지만 이 강제 변환을 수행하면 판독기를 호출하여 메타데이터 항목을 쿼리하는 코드가 간소화됩니다.
IWICPersistStream 인터페이스
IWICPersistStream 인터페이스는 IPersistStream에서 상속되며 WICPersistOptions 열거형을 사용하여 개체를 저장하고 로드하는 추가 메서드를 제공합니다.
다음 코드는 wincodecsdk.idl 파일에 정의된 IWICPersistStream 인터페이스의 정의를 보여 줍니다.
interface IWICPersistStream : IPersistStream
{
HRESULT LoadEx(
[in, unique] IStream *pIStream,
[in, unique] const GUID *pguidPreferredVendor,
[in] DWORD dwPersistOptions
);
HRESULT SaveEx(
[in] IStream *pIStream,
[in] DWORD dwPersistOptions,
[in] BOOL fClearDirty
);
};
LoadEx 메서드는 메타데이터 블록을 포함하는 데이터 스트림을 메타데이터 판독기에서 제공합니다. 판독기는 이 스트림을 구문 분석하여 기본 메타데이터 항목에 액세스합니다. 메타데이터 판독기는 원시 메타데이터 콘텐츠의 시작 부분에 있는 하위 스트림으로 초기화됩니다. 판독기에서 전체 스트림이 필요하지 않은 경우 하위 스트림은 범위에서 메타데이터 블록의 콘텐츠로만 제한됩니다. 그렇지 않으면 전체 메타데이터 스트림이 메타데이터 블록의 시작 부분에 설정된 위치와 함께 제공됩니다.
SaveEx 메서드는 메타데이터 작성기에서 메타데이터 블록을 직렬화하는 데 사용됩니다. 메타데이터 판독기에서 SaveEx 를 사용하는 경우 WINCODEC_ERR_UNSUPPORTEDOPERATION 반환해야 합니다.
IWICStreamProvider 인터페이스
IWICStreamProvider 인터페이스를 사용하면 메타데이터 판독기가 해당 콘텐츠 스트림에 대한 참조를 제공하고, 스트림에 대한 정보를 제공하고, 캐시된 스트림 버전을 새로 고칠 수 있습니다.
다음 코드는 wincodecsdk.idl 파일에 정의된 IWICStreamProvider 인터페이스의 정의를 보여 줍니다.
interface IWICStreamProvider : IUnknown
{
HRESULT GetStream(
[out] IStream **ppIStream
);
HRESULT GetPersistOptions(
[out] DWORD *pdwPersistOptions
);
HRESULT GetPreferredVendorGUID(
[out] GUID *pguidPreferredVendor
);
HRESULT RefreshStream(
);
};
GetStream 메서드는 메타데이터 스트림에 대한 참조를 검색합니다. 반환하는 스트림에는 스트림 포인터가 시작 위치로 다시 설정되어야 합니다. 메타데이터 형식에 전체 스트림 액세스 권한이 필요한 경우 시작 위치는 메타데이터 블록의 시작 위치여야 합니다.
GetPersistOptions 메서드는 WICPersistOptions 열거형에서 스트림의 현재 옵션을 반환합니다.
GetPreferredVendorGUID 메서드는 메타데이터 판독기의 공급업체 GUID를 반환합니다.
RefreshStream 메서드는 메타데이터 스트림을 새로 고칩니다. 이 메서드는 중첩된 메타데이터 블록에 대해 NULL 스트림을 사용하여 LoadEx를 호출해야 합니다. 이는 현재 위치 편집으로 인해 중첩된 메타데이터 블록과 해당 항목이 더 이상 존재하지 않을 수 있기 때문에 필요합니다.
메타데이터 작성기 만들기
메타데이터 기록기는 메타데이터 블록을 이미지 프레임으로 직렬화하거나 이미지 형식이 지원하는 경우 개별 프레임 외부로 직렬화하는 방법을 제공하는 메타데이터 처리기의 유형입니다. 코덱 내의 메타데이터 기록기에 대한 기본 액세스는 각 WIC 인코더가 구현하는 IWICMetadataBlockWriter 인터페이스를 통해서입니다. 이 인터페이스를 사용하면 애플리케이션이 이미지에 포함된 각 메타데이터 블록을 열거하여 각 메타데이터 블록에 대해 적절한 메타데이터 기록기를 검색하고 인스턴스화할 수 있습니다. 해당 메타데이터 기록기가 없는 메타데이터 블록은 알 수 없는 것으로 간주되며 GUID CLSID_WICUnknownMetadataReader 정의됩니다. WIC 지원 애플리케이션이 메타데이터 형식을 직렬화하고 쓸 수 있도록 하려면 IWICMetadataWriter, IWICMetadataReader, IWICPersistStream 및 IWICStreamProvider 인터페이스를 구현하는 클래스를 만들어야 합니다.
참고
메타데이터 형식에 필요한 인터페이스의 일부 메서드를 부적절하게 렌더링하는 제한이 있는 경우 이러한 메서드는 WINCODEC_ERR_UNSUPPORTEDOPERATION 반환해야 합니다.
IWICMetadataWriter 인터페이스
IWICMetadataWriter 인터페이스는 메타데이터 작성기에서 구현해야 합니다. 또한 IWICMetadataWriter는IWICMetadataReader에서 상속되므로 IWICMetadataReader의 모든 메서드도 구현해야 합니다. 두 처리기 형식 모두 동일한 인터페이스 상속이 필요하므로 읽기 및 쓰기 기능을 모두 제공하는 단일 클래스를 만들 수 있습니다.
다음 코드는 wincodecsdk.idl 파일에 정의된 메타데이터 기록기 인터페이스의 정의를 보여줍니다.
interface IWICMetadataWriter : IWICMetadataReader
{
HRESULT SetValue(
[in, unique] const PROPVARIANT *pvarSchema,
[in] const PROPVARIANT *pvarId,
[in] const PROPVARIANT *pvarValue
);
HRESULT SetValueByIndex(
[in] UINT nIndex,
[in, unique] const PROPVARIANT *pvarSchema,
[in] const PROPVARIANT *pvarId,
[in] const PROPVARIANT *pvarValue
);
HRESULT RemoveValue(
[in, unique] const PROPVARIANT *pvarSchema,
[in] const PROPVARIANT *pvarId
);
HRESULT RemoveValueByIndex(
[in] UINT nIndex
);
};
SetValue 메서드는 지정된 메타데이터 항목을 메타데이터 스트림에 씁니다.
SetValueByIndex 메서드는 지정된 메타데이터 항목을 메타데이터 스트림의 지정된 인덱스에 씁니다. 인덱스가 ID가 아니라 메타데이터 블록 내의 항목 위치를 참조합니다.
RemoveValue 메서드는 메타데이터 스트림에서 지정된 메타데이터 항목을 제거합니다.
RemoveValueByIndex 메서드는 메타데이터 스트림에서 지정된 인덱스의 메타데이터 항목을 제거합니다. 항목을 제거한 후 인덱스가 마지막 인덱스가 아닌 경우 나머지 메타데이터 항목이 비어 있는 인덱스 를 차지할 것으로 예상됩니다. 또한 항목이 제거된 후 개수가 변경될 것으로 예상됩니다.
PROPVARIANT 항목을 형식에 필요한 기본 구조로 변환하는 것은 메타데이터 작성자의 책임입니다. 그러나 메타데이터 판독기와 달리 VARIANT 형식은 호출자가 사용할 데이터 형식을 구체적으로 나타내기 때문에 일반적으로 다른 형식으로 강제 변환해서는 안 됩니다.
메타데이터 작성기는 숨겨진 값이나 인식할 수 없는 값을 포함하여 모든 메타데이터 항목을 이미지 스트림에 커밋해야 합니다. 여기에는 알 수 없는 중첩된 메타데이터 블록이 포함됩니다. 그러나 저장 작업을 시작하기 전에 중요한 메타데이터 항목을 설정하는 것은 인코더의 책임입니다.
메타데이터 스트림에 big-endian 콘텐츠가 포함된 경우 메타데이터 작성기는 처리하는 모든 데이터 값을 교환할 책임이 있습니다. 또한 중첩된 메타데이터 기록기가 저장할 때 big-endian 데이터 스트림으로 작업하고 있음을 알릴 책임이 있습니다.
메타데이터 형식에 해당하는 형식(GUID)을 사용하여 메타데이터 항목 VT_CLSID
에 대한 집합 및 제거 작업을 지원하여 네임스페이스 만들기 및 제거 지원을 구현합니다. 메타데이터 작성 기는 WICSerializeMetadataContent 함수를 호출하여 중첩된 메타데이터 기록기 콘텐츠를 부모 메타데이터 작성기에 올바르게 포함합니다.
메타데이터 형식이 현재 위치 인코딩을 지원하는 경우 필요한 패딩을 관리할 책임이 있습니다. 현재 위치 인코딩에 대한 자세한 내용은 WIC 메타데이터 개요 및 이미지 메타데이터 읽기 및 쓰기 개요를 참조하세요.
IWICPersistStream 인터페이스
IWICPersistStream 인터페이스는 IPersistStream에서 상속되며 WICPersistOptions 열거형을 사용하여 개체를 저장하고 로드하는 추가 메서드를 제공합니다.
다음 코드는 wincodecsdk.idl 파일에 정의된 IWICPersistStream 인터페이스의 정의를 보여 줍니다.
interface IWICPersistStream : IPersistStream
{
HRESULT LoadEx(
[in, unique] IStream *pIStream,
[in, unique] const GUID *pguidPreferredVendor,
[in] DWORD dwPersistOptions
);
HRESULT SaveEx(
[in] IStream *pIStream,
[in] DWORD dwPersistOptions,
[in] BOOL fClearDirty
);
};
LoadEx 메서드는 메타데이터 블록을 포함하는 데이터 스트림을 사용하여 메타데이터 처리기를 제공합니다.
SaveEx 메서드는 메타데이터를 스트림으로 직렬화합니다. 제공된 스트림이 초기화 스트림과 동일한 경우 현재 위치 인코딩을 수행해야 합니다. 현재 위치 인코딩이 지원되는 경우 이 메서드는 내부 인코딩을 수행할 패딩이 부족한 경우 WINCODEC_ERR_TOOMUCHMETADATA 반환해야 합니다. 현재 위치 인코딩이 지원되지 않는 경우 이 메서드는 WINCODEC_ERR_UNSUPPORTEDOPERATION 반환해야 합니다.
IPersistStream::GetSizeMax 메서드를 구현해야 하며 후속 저장에 기록될 메타데이터 콘텐츠의 정확한 크기를 반환해야 합니다.
메타데이터 작성기가 스트림을 통해 초기화되면 IPersistStream::IsDirty 메서드를 구현하여 이미지가 콘텐츠가 변경되었는지 여부를 안정적으로 확인할 수 있도록 해야 합니다.
메타데이터 형식이 중첩된 메타데이터 블록을 지원하는 경우 메타데이터 작성기는 스트림에 저장할 때 중첩된 메타데이터 기록기에 해당 콘텐츠의 직렬화를 위임해야 합니다.
IWICStreamProvider 인터페이스
메타데이터 작성기에 대한 IWICStreamProvider 인터페이스 구현은 메타데이터 판독기의 구현과 동일합니다. 자세한 내용은 이 문서의 메타데이터 판독기 만들기 섹션을 참조하세요.
메타데이터 처리기 설치 및 등록
메타데이터 처리기를 설치하려면 처리기 어셈블리를 제공하고 시스템 레지스트리에 등록해야 합니다. 레지스트리 키를 채우는 방법과 시기를 결정할 수 있습니다.
참고
가독성을 위해 실제 16진수 GUID는 이 문서의 다음 섹션에 표시된 레지스트리 키에 표시되지 않습니다. 지정된 이름에 대한 16진수 값을 찾으려면 wincodec.idl 및 wincodecsdk.idl 파일을 참조하세요.
메타데이터 처리기 레지스트리 키
각 메타데이터 처리기는 고유한 CLSID로 식별되며, 메타데이터 처리기의 범주 ID GUID에 CLSID를 등록하려면 각 처리기가 필요합니다. 각 처리기 형식의 범주 ID는 wincodec.idl에 정의됩니다. 판독기에 대한 범주 ID 이름이 CATID_WICMetadataReader 기록기에 대한 범주 ID 이름이 CATID_WICMetadataWriter.
각 메타데이터 처리기는 고유한 CLSID로 식별되며, 메타데이터 처리기의 범주 ID GUID에 CLSID를 등록하려면 각 처리기가 필요합니다. 각 처리기 형식의 범주 ID는 wincodec.idl에 정의됩니다. 판독기에 대한 범주 ID 이름이 CATID_WICMetadataReader 기록기에 대한 범주 ID 이름이 CATID_WICMetadataWriter.
참고
다음 레지스트리 키 목록에서 {Reader CLSID}는 메타데이터 판독기용으로 제공하는 고유한 CLSID를 나타냅니다. {기록기 CLSID}는 메타데이터 작성기에 제공하는 고유한 CLSID를 나타냅니다. {Handler CLSID}는 제공하는 처리기에 따라 판독기의 CLSID, 기록기의 CLSID 또는 둘 다를 나타냅니다. {Container GUID}는 메타데이터 블록을 포함할 수 있는 컨테이너 개체(이미지 형식 또는 메타데이터 형식)를 나타냅니다.
다음 레지스트리 키는 사용 가능한 다른 메타데이터 처리기에 메타데이터 처리기를 등록합니다.
[HKEY_CLASSES_ROOT\CLSID\{CATID_WICMetadataReaders}\Instance\{Reader CLSID}]
CLSID={Reader CLSID}
Friendly Name="Reader Name"
[HKEY_CLASSES_ROOT\CLSID\{CATID_ WICMetadataWriters}\Instance\{Writer CLSID}]
CLSID={Writer CLSID}
Friendly Name="Writer Name"
처리기를 해당 범주에 등록하는 것 외에도 처리기와 관련된 정보를 제공하는 추가 키를 등록해야 합니다. 판독기와 기록기는 유사한 레지스트리 키 요구 사항을 공유합니다. 다음 구문은 처리기를 등록하는 방법을 보여줍니다. 판독기 처리기와 기록기 처리기는 각각 CLSID를 사용하여 이러한 방식으로 등록해야 합니다.
[HKEY_CLASSES_ROOT\CLSID\{CLSID}]
"Vendor"={VendorGUID}
"Date"="yyyy-mm-dd"
"Version"="Major.Minor.Build.Number"
"SpecVersion"="Major.Minor.Build.Number"
"MetadataFormat"={MetadataFormatGUID}
"RequiresFullStream"=dword:1|0
"SupportsPadding"= dword:1|0
"FixedSize"=0
[HKEY_CLASSES_ROOT\CLSID\{CLSID}\InProcServer32]
@="drive:\path\yourdll.dll"
"ThreadingModel"="Apartment"
[HKEY_CLASSES_ROOT\CLSID\{CLSID}\{LCID}]
Author="Author's Name"
Description = " Metadata Description"
DeviceManufacturer ="Manufacturer Name"
DeviceModels="Device,Device"
FriendlyName="Friendly Name"
메타데이터 읽기 권한자
메타데이터 판독기 등록에는 판독기를 컨테이너 형식으로 포함할 수 있는 방법을 설명하는 키도 포함되어 있습니다. 컨테이너 형식은 TIFF 또는 JPEG와 같은 이미지 형식일 수 있습니다. IFD 메타데이터 블록과 같은 다른 메타데이터 형식일 수도 있습니다. 기본적으로 지원되는 이미지 컨테이너 형식은 wincodec.idl에 나열됩니다. 각 이미지 컨테이너 형식은 GUID_ContainerFormat 시작하는 이름의 GUID로 정의됩니다. 기본적으로 지원되는 메타데이터 컨테이너 형식은 wincodecsdk.idl에 나열됩니다. 각 메타데이터 컨테이너 형식은 GUID_MetadataFormat 시작하는 이름의 GUID로 정의됩니다.
다음 키는 메타데이터 판독기가 지원하는 컨테이너와 해당 컨테이너에서 읽는 데 필요한 데이터를 등록합니다. 판독기에서 지원하는 각 컨테이너는 이러한 방식으로 등록해야 합니다.
[HKEY_CLASSES_ROOT\CLSID\{Reader CLSID}\Containers\{Container GUID}\0]
"Position"=dword:00000000
"Pattern"=hex:ff,ff,ff,...
"Mask"=hex:ff,ff,ff,...
"DataOffset"=dword:00000006
패턴 키는 메타데이터 블록을 판독기와 일치시키는 데 사용되는 이진 패턴을 설명합니다. 메타데이터 판독기에 대한 패턴을 정의할 때 양수 일치는 메타데이터 판독기가 처리 중인 메타데이터 블록의 메타데이터를 이해할 수 있음을 의미합니다.
DataOffset 키는 블록 헤더에서 메타데이터의 고정 오프셋을 설명합니다. 이 키는 선택 사항이며 지정하지 않으면 블록 헤더의 고정 오프셋을 사용하여 실제 메타데이터를 배치할 수 없음을 의미합니다.
메타데이터 기록기
메타데이터 작성기 등록에는 컨테이너 형식에 포함된 메타데이터 콘텐츠 앞의 헤더를 작성하는 방법을 설명하는 키도 포함되어 있습니다. 판독기에서와 마찬가지로 컨테이너 형식은 이미지 형식 또는 다른 메타데이터 블록일 수 있습니다.
다음 키는 메타데이터 작성기가 지원하는 컨테이너와 헤더 및 메타데이터를 작성하는 데 필요한 데이터를 등록합니다. 작성기에서 지원하는 각 컨테이너는 이러한 방식으로 등록해야 합니다.
[HKEY_CLASSES_ROOT\CLSID\{Writer CLSID}\Containers\{Container GUID}]
"WritePosition"=dword:00000000
"WriteHeader"=hex:ff,ff,ff,...
"WriteOffset"=dword:00000000
WriteHeader 키는 작성할 메타데이터 블록 헤더의 이진 패턴을 설명합니다. 이 이진 패턴은 메타데이터 형식의 판독기 패턴 키와 일치합니다.
WriteOffset 키는 메타데이터를 작성해야 하는 블록 헤더의 고정 오프셋을 설명합니다. 이 키는 선택 사항이며 지정하지 않으면 실제 메타데이터를 헤더로 작성해서는 안 됩니다.
메타데이터 처리기 서명
WIC 검색 프로세스에 참여하려면 모든 메타데이터 처리기에 디지털 서명해야 합니다. WIC는 신뢰할 수 있는 인증 기관에서 서명하지 않은 처리기를 로드하지 않습니다. 디지털 서명에 대한 자세한 내용은 코드 서명 소개를 참조하세요.
특별 고려 사항
다음 섹션에는 사용자 고유의 메타데이터 처리기를 만들 때 고려해야 하는 추가 정보가 포함되어 있습니다.
PROPVARIANTS
WIC는 PROPVARIANT 를 사용하여 읽기 및 쓰기 모두에 대한 메타데이터 항목을 나타냅니다. PROPVARIANT는 메타데이터 형식 내에서 사용되는 메타데이터 항목에 대한 데이터 형식 및 데이터 값을 제공합니다. 메타데이터 처리기의 작성자는 메타데이터 형식으로 데이터가 저장되는 방식과 메타데이터 블록 내에서 데이터가 표시되는 방식에 대해 많은 유연성을 제공합니다. 다음 표에서는 다양한 상황에서 사용할 적절한 PROPVARIANT 유형을 결정하는 데 도움이 되는 지침을 제공합니다.
메타데이터 유형은... | PROPVARIANT 형식 사용 | PROPVARIANT 속성 |
---|---|---|
비어 있거나 존재하지 않습니다. | VT_EMPTY | 해당 사항 없음 |
정의되지 않았습니다. | VT_BLOB | Blob 속성을 사용하여 CoTaskMemAlloc를 사용하여 할당된 BLOB 개체에 대한 크기와 포인터를 설정합니다. |
메타데이터 블록입니다. | VT_UNKNOWN | 이 형식은 punkVal 속성을 사용합니다. |
형식의 배열입니다. | VT_VECTOR | VT_{type} | ca{type} 속성을 사용하여 CoTaskMemAlloc를 사용하여 할당된 배열에 대한 개수 및 포인터를 설정합니다. |
메타데이터 블록의 배열입니다. | VT_VECTOR | VT_VARIANT | capropvar 속성을 사용하여 변형 배열을 설정합니다. |
서명된 합리 값입니다. | VT_I8 | hVal 속성을 사용하여 값을 설정합니다. 상위 단어를 분모로 설정하고 낮은 단어를 숫자로 설정합니다. |
합리적인 값입니다. | VT_UI8 | uhVal 속성을 사용하여 값을 설정합니다. HighPart를 분모로 설정하고 LowPart를 숫자로 설정합니다. LowPart는 부호 없는 int입니다. 부호 비트가 있는 경우 유지되도록 하려면 부호 없는 int에서 int로 숫자기를 변환해야 합니다. |
배열 항목을 나타내는 중복성을 방지하려면 안전한 배열을 사용하지 마세요. 단순 배열만 사용합니다. 이렇게 하면 PROPVARIANT 형식을 해석할 때 애플리케이션에서 수행해야 하는 작업이 줄어듭니다.
가능하면 값을 사용하지 VT_BYREF
말고 인라인으로 저장합니다.
VT_BYREF
는 작은 형식(메타데이터 항목에 공통)에 비효율적이며 크기 정보를 제공하지 않습니다.
PROPVARIANT를 사용하기 전에 항상 PropVariantInit를 호출하여 값을 초기화합니다. PROPVARIANT가 완료되면 항상 PropVariantClear 를 호출하여 변수에 할당된 메모리를 해제합니다.
8BIM 처리기
8BIM 메타데이터 블록에 대한 메타데이터 처리기를 작성할 때는 8BIM 서명과 ID를 모두 캡슐화하는 서명을 사용해야 합니다. 예를 들어 네이티브 8BIMIPTC 메타데이터 판독기는 판독기 검색을 위해 다음 레지스트리 정보를 제공합니다.
[HKEY_CLASSES_ROOT\CLSID\{0010668C-0801-4DA6-A4A4-826522B6D28F}\Containers\{16100D66-8570-4BB9-B92D-FDA4B23ECE67}\0]
"Position"=dword:00000000
"Pattern"=hex:38,42,49,4d,04,04
"Mask"=hex:ff,ff,ff,ff,ff,ff
"DataOffset"=dword:00000006
8BIMIPTC 판독기는 등록된 패턴의 0x38, 0x42, 0x49, 0x4D, 0x04, 0x04. 처음 4바이트(0x38, 0x42, 0x49, 0x4D)는 8BIM 서명이고 마지막 2바이트(0x04, 0x04)는 IPTC 레코드의 ID입니다.
따라서 해상도 정보에 대한 8BIM 메타데이터 판독기를 작성하려면 0x38, 0x42, 0x49, 0x4D, 0x03, 0xED 등록된 패턴이 필요합니다. 다시 말하지만 처음 4바이트(0x38, 0x42, 0x49, 0x4D)는 8BIM 서명입니다. 그러나 마지막 두 바이트(0x03, 0xED)는 PSD 형식으로 정의된 해상도 정보 ID입니다.
관련 항목
-
개념
-
기타 리소스