IStream - 복합 파일 구현

IStream 인터페이스는 개체를 스트림하기 위한 데이터 읽기 및 쓰기를 지원합니다. 구조적 스토리지 개체에서 스트림 개체는 데이터를 포함하고 스토리지는 구조를 제공합니다. 간단한 데이터는 스트림에 직접 쓸 수 있지만 더 자주 스트림은 스토리지 개체 내에 중첩된 요소입니다. 표준 파일과 비슷합니다.

IStream 사양은 COM 구현에서 지원하는 것보다 더 많은 기능을 정의합니다. 예를 들어 IStream 인터페이스는 64비트 검색 포인터가 필요한 최대 2바이트 길이의 스트림을 정의합니다. 그러나 COM 구현은 최대 2Gb의 길이(4GB)의 스트림만 지원하며 읽기 및 쓰기 작업은 항상 한 번에 2 ² 바이트로 제한됩니다. COM 구현은 스트림 트랜잭션 또는 지역 잠금도 지원하지 않습니다.

전역 메모리를 기반으로 간단한 스트림을 만들려면 API 함수 CreateStreamOnHGlobal을 호출하여 IStream 포인터를 가져옵니다. 복합 파일 개체 내에서 IStream 포인터를 얻으려면 StgCreateDocfile 또는 StgOpenStorage를 호출합니다. 이러한 함수는 IStorage 포인터를 검색합니다. 그러면 IStream 포인터에 대해 CreateStream 또는 OpenStream을 호출할 수 있습니다. 두 경우 모두 동일한 IStream 구현 코드가 사용됩니다.

참고

구조적 스토리지의 복합 파일 구현은 ISequentialStream에 대한 QueryInterface 메서드에서 성공하지 못하지만 IStream 인터페이스 포인터를 통한 읽기쓰기 메서드를 포함합니다.

 

사용 시기

IStream의 메서드를 호출하여 데이터를 읽고 스트림에 씁니다.

스트림 개체를 다른 프로세스로 마샬링할 수 있으므로 애플리케이션은 전역 메모리를 사용하지 않고도 스토리지 개체의 데이터를 공유할 수 있습니다. 스트림 개체의 COM 복합 파일 구현에서 COM의 사용자 지정 마샬링 기능은 두 프로세스에 공유 메모리 액세스 권한이 있는 경우 새 프로세스에서 원래 개체의 원격 버전을 만듭니다. 따라서 원격 버전은 해당 기능을 수행하기 위해 원래 프로세스와 통신할 필요가 없습니다.

스트림 개체의 원격 버전은 원래 스트림과 동일한 검색 포인터를 공유합니다. 검색 포인터를 공유하지 않으려면 IStream::Clone 메서드를 사용하여 원격 프로세스에 대한 스트림 개체의 복사본을 제공합니다.

참고

컴퓨터 메모리의 힙보다 큰 스트림 개체를 만들고 HGLOBAL 핸들을 전역 메모리 개체에 사용하는 경우 스트림 개체는 GlobalRealloc 메서드를 내부적으로 호출합니다. GlobalRealloc은 항상 원본에서 대상으로 데이터를 복사하므로 스트림 개체를 20MB에서 25MB로 늘리려면 많은 시간이 필요합니다. 이는 복사된 증분 크기 때문이며 디스크 교환으로 인해 컴퓨터에 45MB 미만의 메모리가 있는 경우 악화됩니다.

기본 솔루션은 GlobalAlloc 대신 VirtualAlloc에서 할당한 메모리를 사용하는 IStream 메서드를 구현하는 것입니다. 이렇게 하면 가상 주소 공간의 큰 청크를 예약한 다음 필요에 따라 해당 주소 공간 내에서 메모리를 커밋할 수 있습니다. 데이터 복사가 발생하지 않으며 메모리가 필요한 경우에만 커밋됩니다.

GlobalRealloc의 대안은 스트림 개체에서 IStream::SetSize 메서드를 호출하여 메모리 할당을 미리 늘리는 것입니다. 그러나 위에서 설명한 대로 VirtualAlloc을 사용하는 것만큼 효율적이지는 않습니다.

 

메서드

ISequentialStream::Read

스트림 개체의 지정된 바이트 수를 현재 검색 포인터에서 시작하는 메모리로 읽습니다. 이 구현은 읽는 동안 스트림의 끝에 도달한 경우 S_OK 반환합니다. (MS-DOS FAT 파일 시스템에 있는 "파일 끝" 동작과 동일합니다.)

ISequentialStream::Write

현재 검색 포인터에서 시작하여 지정된 수를 바이트 단위로 스트림 개체에 씁니다. 이 구현에서 스트림 개체는 스파스가 아닙니다. 모든 채우기 바이트는 결국 디스크에 할당되고 스트림에 할당됩니다.

IStream::Seek

검색 포인터를 스트림 시작, 스트림 끝 또는 현재 검색 포인터에 상대적인 새 위치로 변경합니다.

IStream::SetSize

스트림 개체의 크기를 변경합니다. 이 구현에서는 할당된 공간이 연속된다는 보장은 없습니다.

IStream::CopyTo

지정된 바이트 수를 스트림의 현재 검색 포인터에서 다른 스트림의 현재 검색 포인터 위치로 복사합니다.

IStream::Commit

IStream의 복합 파일 구현은 트랜잭션 모드가 아닌 직접 모드에서만 스트림 열기를 지원합니다. 따라서 메서드는 모든 메모리 버퍼를 다음 스토리지 수준으로 플러시하는 것 외에 호출할 때 효과가 없습니다.

이 구현에서는 스트림에 변경 내용을 커밋하는 경우 중요하지 않으며 스토리지 개체에 대한 변경 내용만 커밋하면 됩니다.

IStream::Revert

이 구현은 트랜잭션된 스트림을 지원하지 않으므로 이 메서드에 대한 호출은 영향을 주지 않습니다.

IStream::LockRegion

범위 잠금은 이 구현에서 지원되지 않으므로 이 메서드에 대한 호출은 영향을 주지 않습니다.

IStream::UnlockRegion

이전에 IStream::LockRegion으로 제한되었던 바이트 범위에 대한 액세스 제한을 제거합니다.

IStream::Stat

이 스트림에 대한 STATSTG 구조를 검색합니다.

IStream::Clone

고유의 검색 포인터를 사용하여 원래 스트림과 같은 바이트를 참조하는 새 스트림 개체를 만듭니다.

단순 모드 IStream 에는 다음 제약 조건이 적용됩니다.

  • 스트림은 단순 모드 스토리지에서 만들거나 연 경우 단순 모드입니다. 스토리지는 grfMode 매개 변수에 설정된 STGM_SIMPLE 플래그를 사용하여 만들거나 열면 단순 모드입니다.
  • CloneCopyTo 메서드는 지원되지 않습니다.
  • Stat 메서드는 지원되지만 STATFLAG_NONAME 값을 지정해야 합니다.

IStream

IStorage

CreateStreamOnHGlobal

StgCreateDocfile

StgOpenStorage