다음을 통해 공유


IPropertyStorage-Compound 파일 구현

구조적 스토리지 아키텍처의 COM 구현을 복합 파일이라고 합니다. 복합 파일에 구현된 스토리지 개체에는 단일 영구 속성 집합을 관리하는 인터페이스인 IPropertyStorage와 영구 속성 집합 그룹을 관리하는 인터페이스인 IPropertySetStorage의 구현이 모두 포함됩니다. IPropertyStorage 인터페이스에 대한 자세한 내용은 IPropertyStorage속성 스토리지 고려 사항을 참조하세요.

IPropertyStorage의 복합 파일 구현에 대한 포인터를 얻으려면 StgCreateStorageEx를 호출하여 새 복합 파일 개체 또는 StgOpenStorageEx를 만들어 이전에 만든 복합 파일 개체를 엽니다. StgCreateStorageEx의 경우 stgfmt 매개 변수를 STGFMT_STORAGE 설정해야 합니다. StgOpenStorageEx의 경우 stgfmt 매개 변수를 STGFMT_STORAGE 또는 STGFMT_ANY 설정해야 합니다. 두 경우 모두 riid 매개 변수를 IID_IPropertySetStorage 설정해야 합니다. 두 함수 모두 개체 IPropertySetStorage 인터페이스에 대한 포인터를 제공합니다. 해당 인터페이스의 Create 또는 Open 메서드를 호출하면 해당 메서드를 호출하는 데 사용할 수 있는 IPropertyStorage 인터페이스에 대한 포인터가 표시됩니다.

IPropertySetStorage의 복합 파일 구현에 대한 포인터를 가져오는 다른 방법은 이전 StgCreateDocfile 및 StgOpenStorage 함수를 호출하거나 stgCreateStorageEx 또는 StgOpenStorageEx 함수에 대한 IID_IStorage riid 매개 변수를 지정하는 것입니다. 두 경우 모두 개체의 IStorage 인터페이스에 대한 포인터가 반환됩니다. 영구 속성 집합을 사용하여 IPropertySetStorage 인터페이스에 대해 QueryInterface를 호출하고 IID(인터페이스 식별자) IID_IPropertySetStorage 헤더 정의 이름을 지정합니다.

사용 시기

IPropertyStorage를 사용하여 단일 속성 집합 내의 속성을 관리합니다. 해당 메서드는 속성 식별자와 연결할 수 있는 속성 및 선택적 문자열 이름을 모두 읽고, 쓰고, 삭제할 수 있습니다. 다른 메서드는 표준 커밋 및 되돌리기 스토리지 작업을 지원합니다. 속성 스토리지와 연결된 시간을 설정할 수 있는 메서드와 사용자 인터페이스 코드와 같은 다른 코드를 속성 집합과 연결하는 데 사용할 수 있는 CLSID 할당을 허용하는 메서드도 있습니다. Enum 메서드를 호출하면 집합의 속성을 열거할 수 있는 IEnumSTATPROPSTG의 복합 파일 구현에 대한 포인터가 제공됩니다.

참고

단순 모드 속성 집합 스토리지에서 StgCreateDocfile, StgCreateStorageEx, StgOpenStorage 또는 StgOpenStorageEx를 호출하여 IPropertyStorage에 대한 포인터를 가져오는 경우 IPropertyStorage 메서드는 단순 모드 스트림의 규칙을 준수합니다. 속성 집합 스토리지는 STGM_SIMPLE 플래그를 사용하여 만들거나 연 파일에 대해 가져온 경우 단순 모드입니다. 이 경우 기본 스트림을 항상 더 크게 만들 수 있는 것은 아니며 기존 속성을 더 큰 속성으로 바꿀 수 없습니다. 자세한 내용은 IPropertySetStorage-Compound 파일 구현을 참조하세요.

 

IPropertyStorage 및 캐싱

IPropertyStorage의 복합 파일 구현은 성능을 향상시키기 위해 메모리에서 열린 속성 집합을 캐시합니다. 따라서 속성 집합에 대한 변경 내용은 Commit 또는 Release (마지막 참조) 메서드가 호출될 때까지 복합 파일에 기록되지 않습니다.

단순 모드 속성 집합

속성 스토리지 개체는 단순 모드 속성 집합 스토리지 개체에서 만든 경우 단순 모드에 있습니다. 예를 들어 속성 집합 스토리지 개체는 grfMode 매개 변수에 설정된 STGM_SIMPLE 플래그를 사용하여 StgOpenStorageEx 함수에서 가져온 경우 단순 모드가 됩니다. "단순 모드"는 "단순 속성 집합"과 관련이 없습니다. 속성 집합은 grfFlags 매개 변수에 설정된 PROPSETFLAG_NONSIMPLE 플래그를 사용하여 IPropertySetStorage::Create를 호출하여 만든 경우 간단합니다. 단순 및 비심플 속성 집합에 대한 자세한 내용은 속성 집합에 대한 스토리지 및 스트림 개체를 참조하세요.

단순 모드 속성 스토리지 개체를 만들 때는 사용 제한이 없습니다. 기존 단순 모드 속성 스토리지 개체를 열면 속성 집합을 저장하는 기본 스트림 개체를 키울 수 없습니다. 따라서 변경에 더 큰 스트림이 필요한 경우 이러한 속성 스토리지 개체를 항상 수정할 수 있는 것은 아닙니다.

속성 집합 형식

IPropertyStorage의 복합 파일 구현은 버전 0과 버전 1 속성 집합 serialization 형식을 모두 지원합니다. 버전 1 형식은 Windows 2000에서 실행되는 컴퓨터에서 지원됩니다. 자세한 내용은 속성 집합 serialization을 참조하세요. 속성 집합은 버전 0 형식으로 만들어지고 새 기능이 요청되지 않는 한 해당 형식으로 유지됩니다. 이 경우 형식이 버전 1로 업데이트됩니다.

예를 들어 PROPSETFLAG_DEFAULT 플래그를 사용하여 속성 집합을 만든 경우 해당 형식은 버전 0입니다. 버전 0 형식을 준수하는 속성 형식이 해당 속성 집합에 기록되고 읽는 한 속성 집합은 버전 0 형식으로 유지됩니다. 버전 1 속성 형식이 속성 집합에 기록되면 속성 집합이 자동으로 버전 1로 업데이트됩니다. 이후에는 버전 0만 인식하는 구현에서 해당 속성 집합을 더 이상 읽을 수 없습니다.

IPropertyStorage 및 Variant 형식

IPropertyStorage의 복합 파일 구현은 PROPVARIANT 구조체의 vt 멤버에서 VT_UNKNOWN 또는 VT_DISPATCH 변형 형식을 지원하지 않습니다.

다음 표에서는 SafeArray 내에서 지원되는 변형 형식을 나열합니다. 즉, 이러한 값은 PROPVARIANT 구조체의 vt 멤버에 있는 VT_ARRAY 결합할 수 있습니다.

IPropertyStorage의 복합 파일 구현에 의해 SafeArray 내에서 지원되는 변형 형식

VT_I1

VT_UI1

VT_I2

VT_UI2

VT_I4

VT_UI4

VT_INT

VT_UINT

VT_R4

VT_R8

VT_CY

VT_DATE

VT_BSTR

VT_BOOL

VT_DECIMAL

VT_ERROR

VT_VARIANT

 

 

VT_VARIANT VT_ARRAY 결합하면 SafeArray 자체에는 PROPVARIANT 구조체가 있습니다. 그러나 이러한 요소의 형식은 이전 목록에서 가져와야 하며, VT_VARIANT 수 없으며, VT_VECTOR, VT_ARRAY 또는 VT_BYREF 지표를 포함할 수 없습니다.

IPropertyStorage 메서드

IPropertyStorage의 복합 파일 구현은 다음 메서드를 지원합니다.

IPropertyStorage::ReadMultiple

rgpspec 배열에 지정된 속성을 읽고 PROPVARIANTs의 rgvar 배열에 있는 모든 유효한 속성의 값을 제공합니다. COM 복합 파일 구현에서 스트림 또는 스토리지 형식을 참조하는 중복 속성 식별자는 IStorage::OpenStream 또는 IStorage::OpenStorage를 여러 번 호출하며 ReadMultiple의 성공 또는 실패는 기본 스토리지 구현의 열기 작업 공유 기능에 따라 달라집니다. 복합 파일 STGM_SHARE_EXCLUSIVE 강제로 수행되므로 여러 번의 열린 시도가 실패합니다. 동일한 부모 스토리지에서 동일한 스토리지 개체를 두 번 이상 여는 것은 지원되지 않습니다. STGM_SHARE_EXCLUSIVE 플래그를 지정해야 합니다.

또한 COM 복합 파일 구현에서 동일한 IPropertyStorage 포인터를 통해 동일한 스트림 또는 스토리지 반환 속성을 여러 번 요청하는 경우 스레드로부터 안전한 작업을 보장하기 위해 속성이 이미 열려 있는지 여부와 기본 파일 시스템에서 스트림 또는 스토리지의 여러 개 열기를 처리하는지에 따라 열린 작업이 성공하거나 실패합니다. 따라서 스트림 또는 스토리지 반환 속성에 대한 ReadMultiple 작업은 항상 IStorage::OpenStream 또는 IStorage::OpenStorage를 호출하여 원래 속성 집합을 열거나 만들 때 지정된 액세스(STGM_READWRITE 등)와 공유 플래그(STGM_SHARE_EXCLUSIVE 등)를 전달합니다.

메서드가 실패하면 rgvar[]에 기록된 값이 정의되지 않습니다. 일부 스트림 또는 스토리지 반환 속성이 성공적으로 열렸지만 실행이 완료되기 전에 오류가 발생하는 경우 메서드가 반환되기 전에 이러한 속성을 해제해야 합니다.

IPropertyStorage::WriteMultiple

rgpspec[] 배열에 지정된 속성을 작성하여 rgvar[]에 지정된 PROPVARIANT 태그 및 값을 할당합니다. 이미 존재하는 속성에는 지정된 PROPVARIANT 값이 할당됩니다. 현재 존재하지 않는 속성이 만들어집니다.

IPropertyStorage::D eleteMultiple

rgpspec[]에 지정된 속성을 삭제합니다.

IPropertyStorage::ReadPropertyNames

rgpropid[] 배열에 지정된 속성 ID와 연결된 기존 문자열 이름을 읽습니다.

IPropertyStorage::WritePropertyNames

rglpwstrName 배열에 지정된 문자열 이름을 rgpropid 배열에 지정된 속성 ID에 할당합니다.

IPropertyStorage::D eletePropertyNames

rgpropid[] 배열에 지정된 속성의 속성 이름을 삭제합니다.

IPropertyStorage::SetClass

속성 집합 스트림의 CLSID 를 설정합니다. 복합 파일 구현에서 CLSID를 비심플 속성 집합( IPropertySetStorage::Create에 설명된 대로 합법적으로 스토리지 또는 스트림 반환 속성을 포함할 수 있음)에 설정하면 기본 하위 저장소에서 CLSID를 설정하여 IStorage::Stat 호출을 통해 가져올 수 있습니다.

IPropertyStorage::Commit

단순 및 비심플 속성 집합 모두에 대해 속성 집합 메모리 이미지를 기본 스토리지로 플러시합니다. 또한 비임플 트랜잭션 모드 속성 집합의 경우 이 메서드는 속성 집합이 포함된 스토리지에서 커밋( IStorage::Commit에서와 같이)을 수행합니다.

IPropertyStorage::Revert

비심플 속성 집합의 경우에만 기본 스토리지의 Revert 메서드를 호출하고 'contents' 스트림을 다시 엽니다. 단순 속성 집합의 경우 이 인터페이스는 항상 S_OK 반환합니다. 비심플 속성 집합은 IPropertySetStorage::Create 메서드의 PROPSETFLAG_NONSIMPLE 플래그를 사용하여 만든 집합입니다. 자세한 내용은 속성 집합에 대한 스토리지 및 스트림 개체를 참조하세요 .

IPropertyStorage::Enum

집합의 각 속성에 대한 정보를 제공하는 STATPROPSTG 구조를 열거하기 위해 호출할 수 있는 메서드인 IEnumSTATPROPSTG의 instance 생성합니다. 이 구현은 전체 속성 집합을 읽고 IEnumSTATPROPSTG::Clone 이 호출될 때 공유할 수 있는 배열을 만듭니다. 속성 집합에 대한 변경 내용은 열려 있는 IEnumSTATPROPSTG instance 반영되지 않습니다. 이러한 변경 내용을 보려면 이 열거자의 새 instance 생성해야 합니다.

IPropertyStorage::Stat

전체 속성 집합에 대한 데이터를 포함하는 STATPROPSETSTG 구조체의 멤버를 채웁니다. 반환할 때 구조체에 대한 포인터를 제공합니다. 비임플 스토리지 집합의 경우 이 구현은 IStorage::Stat (또는 IStream::Stat)를 호출하여 기본 스토리지 또는 스트림에서 시간을 가져옵니다. 간단한 스토리지 집합의 경우 시간이 유지되지 않습니다.

IPropertyStorage::SetTimes

비심플 속성 집합의 경우에만 는 기본 스토리지에서 지원하는 시간을 설정합니다. 복합 파일 스토리지 구현은 수정, 액세스 및 만들기의 세 가지 모두를 지원합니다. 이 SetTimes 구현은 기본 스토리지의 IStorage::SetElementTimes 메서드를 호출하여 이러한 시간을 검색합니다.

IPropertyStorage

IStorage::SetElementTimes