STGM 상수

STGM 상수는 개체 및 개체의 액세스 모드를 만들고 삭제하기 위한 조건을 나타내는 플래그입니다. STGM 상수는 IStorage, IStreamIPropertySetStorage 인터페이스 및 StgCreateDocfile, StgCreateStorageEx, StgCreateDocfileOnILockBytes, StgOpenStorageStgOpenStorageEx 함수에 포함됩니다.

이러한 요소는 종종 OR연산자 를 사용하여 결합됩니다. 다음 표에 나열된 대로 그룹에서 해석됩니다. 단일 그룹에서 둘 이상의 요소를 사용하는 것은 유효하지 않습니다.

StgCreateStorageEx 또는 IStorage::CreateStream과 같은 개체를 만들 때 만들기 그룹의 플래그를 사용합니다.

트랜잭션에 대한 자세한 내용은 설명 섹션을 참조하세요.

그룹 플래그
Access STGM_READ 0x00000000L
STGM_WRITE 0x00000001L
STGM_READWRITE 0x00000002L
공유 STGM_SHARE_DENY_NONE 0x00000040L
STGM_SHARE_DENY_READ 0x00000030L
STGM_SHARE_DENY_WRITE 0x00000020L
STGM_SHARE_EXCLUSIVE 0x00000010L
STGM_PRIORITY 0x00040000L
만들기 STGM_CREATE 0x00001000L
STGM_CONVERT 0x00020000L
STGM_FAILIFTHERE 0x00000000L
트랜잭션 중 STGM_DIRECT 0x00000000L
STGM_TRANSACTED 0x00010000L
트랜잭션 성능 STGM_NOSCRATCH 0x00100000L
STGM_NOSNAPSHOT 0x00200000L
직접 SWMR 및 단순 STGM_SIMPLE 0x08000000L
STGM_DIRECT_SWMR 0x00400000L
릴리스에서 삭제 STGM_DELETEONRELEASE 0x04000000L

STGM_READ

0x00000000L

개체가 읽기 전용임을 나타냅니다. 즉, 수정할 수 없습니다. 예를 들어 스트림 개체가 STGM_READ 열린 경우 ISequentialStream::Read 메서드를 호출할 수 있지만 ISequentialStream::Write 메서드는 호출되지 않을 수 있습니다. 마찬가지로 STGM_READ 사용하여 스토리지 개체를 연 경우 IStorage::OpenStreamIStorage::OpenStorage 메서드가 호출될 수 있지만 IStorage::CreateStreamIStorage::CreateStorage 메서드는 호출되지 않을 수 있습니다.

STGM_WRITE

0x00000001L

개체에 대한 변경 내용을 저장할 수 있지만 해당 데이터에 대한 액세스는 허용하지 않습니다. IPropertyStorageIPropertySetStorage 인터페이스의 제공된 구현은 이 쓰기 전용 모드를 지원하지 않습니다.

STGM_READWRITE

0x00000002L

개체 데이터의 액세스 및 수정을 사용하도록 설정합니다. 예를 들어 이 모드에서 스트림 개체를 만들거나 열면 IStream::Read 및 IStream:: Write를 모두 호출할 수 있습니다. 이 상수는 STGM_WRITE STGM_READ 요소의 간단한 이진 OR 작업이 아닙니다.

STGM_SHARE_DENY_NONE

0x00000040L

개체의 후속 열기가 읽기 또는 쓰기 액세스가 거부되지 않도록 지정합니다. 공유 그룹의 플래그가 지정되지 않은 경우 이 플래그를 가정합니다.

STGM_SHARE_DENY_READ

0x00000030L

이후에 다른 사용자가 STGM_READ 모드에서 개체를 열지 못하게 합니다. 일반적으로 루트 스토리지 개체에 사용됩니다.

STGM_SHARE_DENY_WRITE

0x00000020L

이후에 다른 사용자가 STGM_WRITE 또는 STGM_READWRITE 액세스를 위해 개체를 열지 못하게 합니다. 트랜잭션 모드에서는 스냅샷이 필요하지 않으므로 STGM_SHARE_DENY_WRITE 또는 STGM_SHARE_EXCLUSIVE 공유하면 성능이 크게 향상될 수 있습니다. 트랜잭션에 대한 자세한 내용은 설명 섹션을 참조하세요.

STGM_SHARE_EXCLUSIVE

0x00000010L

이후에 다른 사용자가 어떤 모드에서든 개체를 열지 못하게 합니다. 이 값은 STGM_SHARE_DENY_READ STGM_SHARE_DENY_WRITE 값의 간단한 비트 OR 연산이 아닙니다. 트랜잭션 모드에서는 스냅샷이 필요하지 않으므로 STGM_SHARE_DENY_WRITE 또는 STGM_SHARE_EXCLUSIVE 공유하면 성능이 크게 향상될 수 있습니다. 트랜잭션에 대한 자세한 내용은 설명 섹션을 참조하세요.

STGM_PRIORITY

0x00040000L

가장 최근에 커밋된 버전에 대한 단독 액세스 권한이 있는 스토리지 개체를 엽니다. 따라서 다른 사용자는 개체가 우선 순위 모드로 열려 있는 동안에는 변경 내용을 커밋할 수 없습니다. 복사 작업에 대한 성능 이점을 얻을 수 있지만 다른 사용자가 변경 내용을 커밋하지 못하도록 방지할 수 있습니다. 개체가 우선 순위 모드로 열려 있는 시간을 제한합니다. 우선 순위 모드로 STGM_DIRECTSTGM_READ 지정해야 하며 STGM_DELETEONRELEASE 지정할 수 없습니다. STGM_DELETEONRELEASEStgCreateStorageEx와 같은 루트 개체를 만들 때만 유효합니다. StgOpenStorageEx와 같은 기존 루트 개체를 열 때는 유효하지 않습니다. IStorage::OpenStorage와 같이 하위 집합을 만들거나 열 때도 유효하지 않습니다.

STGM_CREATE

0x00001000L

새 개체가 교체되기 전에 기존 스토리지 개체 또는 스트림을 제거해야 했음을 나타냅니다. 기존 개체가 성공적으로 제거된 경우에만 이 플래그를 지정할 때 새 개체가 만들어집니다.

이 플래그는 다음을 만들 때 사용됩니다.

  • 디스크에 스토리지 개체가 있지만 해당 이름의 파일이 있습니다.
  • 스토리지 개체 내의 개체이지만 지정된 이름을 가진 개체가 있습니다.
  • 바이트 배열 개체이지만 지정된 이름의 개체가 있습니다.

이 플래그는 StgOpenStorageEx 또는 IStorage::OpenStream과 같은 열린 작업과 함께 사용할 수 없습니다.

STGM_CONVERT

0x00020000L

"Contents"라는 스트림에서 기존 데이터를 유지하면서 새 개체를 만듭니다. 스토리지 개체 또는 바이트 배열의 경우 기존 파일 또는 바이트 배열에 현재 계층화된 스토리지 개체가 포함되어 있는지 여부에 관계없이 이전 데이터의 형식이 스트림으로 지정됩니다. 이 플래그는 루트 스토리지 개체를 만들 때만 사용할 수 있습니다. 스토리지 개체 내에서는 사용할 수 없습니다. 예를 들어 IStorage::CreateStream에 있습니다. 이 플래그와 STGM_DELETEONRELEASE 플래그를 동시에 사용하는 것도 유효하지 않습니다.

STGM_FAILIFTHERE

0x00000000L

지정된 이름의 기존 개체가 있는 경우 만들기 작업이 실패하게 합니다. 이 경우 STG_E_FILEALREADYEXISTS 반환됩니다. 기본 생성 모드입니다. 즉, 다른 만들기 플래그가 지정되지 않은 경우 STGM_FAILIFTHERE 암시됩니다.

STGM_DIRECT

0x00000000L

직접 모드에서 스토리지 또는 스트림 요소에 대한 각 변경 내용이 발생할 때 기록됨을 나타냅니다. STGM_DIRECT 또는STGM_TRANSACTED 지정되지 않은 경우 기본값입니다.

STGM_TRANSACTED

0x00010000L

트랜잭션 모드에서는 명시적 커밋 작업이 호출된 경우에만 변경 내용이 버퍼링되고 기록됨을 나타냅니다. 변경 내용을 무시하려면 IStream, IStorage 또는 IPropertyStorage 인터페이스에서 Revert 메서드를 호출합니다. IStorage의 COM 복합 파일 구현은 트랜잭션된 스트림을 지원하지 않습니다. 즉, 스트림은 직접 모드에서만 열 수 있으며 변경 내용을 되돌리기 수 없지만 트랜잭션된 스토리지는 지원됩니다. IPropertySetStorage의 복합 파일, 독립 실행형 및 NTFS 파일 시스템 구현은 마찬가지로 이러한 속성 집합이 스트림에 저장되기 때문에 트랜잭션된 단순 속성 집합을 지원하지 않습니다. 그러나 IPropertySetStorage::CreategrfFlags 매개 변수에 PROPSETFLAG_NONSIMPLE 플래그를 지정하여 만들 수 있는 비심플 속성 집합의 트랜잭션이 지원됩니다.

STGM_NOSCRATCH

0x00100000L

트랜잭션 모드에서 임시 스크래치 파일은 일반적으로 Commit 메서드가 호출될 때까지 수정 내용을 저장하는 데 사용됨을 나타냅니다. STGM_NOSCRATCH 지정하면 원래 파일의 사용되지 않은 부분을 해당 용도로 새 파일을 만드는 대신 작업 공간으로 사용할 수 있습니다. 원본 파일의 데이터에는 영향을 주지 않으며, 경우에 따라 성능이 향상될 수 있습니다. STGM_TRANSACTED 지정하지 않고 이 플래그를 지정하는 것은 유효하지 않으며 이 플래그는 루트 열기에서만 사용할 수 있습니다. NoScratch 모드에 대한 자세한 내용은 설명 섹션을 참조하세요.

STGM_NOSNAPSHOT

0x00200000L

이 플래그는 STGM_TRANSACTED STGM_SHARE_EXCLUSIVE또는STGM_SHARE_DENY_WRITE 없이 스토리지 개체를 열 때 사용됩니다. 이 경우 STGM_NOSNAPSHOT 지정하면 시스템 제공 구현에서 파일의 스냅샷 복사본을 만들지 못하게 됩니다. 대신 파일의 변경 내용이 파일의 끝에 기록됩니다. 커밋 중에 통합이 수행되고 파일에 현재 기록기가 하나만 있는 경우 사용되지 않는 공간은 회수되지 않습니다. 스냅샷 모드에서 파일을 열면 STGM_NOSNAPSHOT 지정하지 않고 다른 열린 작업을 수행할 수 없습니다. 이 플래그는 루트 열기 작업에서만 사용할 수 있습니다. NoSnapshot 모드에 대한 자세한 내용은 설명 섹션을 참조하세요.

STGM_SIMPLE

0x08000000L

제한되지만 자주 사용되는 사례에서 복합 파일의 더 빠른 구현을 제공합니다. 자세한 내용은 주의 섹션을 참조하세요.

STGM_DIRECT_SWMR

0x00400000L

단일 기록기, 다중 판독기 파일 작업에 대한 직접 모드를 지원합니다. 자세한 내용은 주의 섹션을 참조하세요.

STGM_DELETEONRELEASE

0x04000000L

루트 스토리지 개체가 해제될 때 기본 파일이 자동으로 제거됨을 나타냅니다. 이 기능은 임시 파일을 만드는 데 가장 유용합니다. 이 플래그는 StgCreateStorageEx와 같은 루트 개체를 만들 때만 사용할 수 있습니다. StgOpenStorageEx와 같은 루트 개체를 열거나 IStorage::CreateStream과 같은 하위 개체를 만들거나 열 때는 유효하지 않습니다. 이 플래그와 STGM_CONVERT 플래그를 동시에 사용하는 것도 유효하지 않습니다.

설명

이러한 플래그를 결합할 수 있지만 관련 플래그의 각 그룹에서 하나의 플래그만 선택할 수 있습니다. 일반적으로 이러한 상수를 사용하는 모든 함수 및 메서드에 대해 각 액세스 및 공유 그룹의 하나의 플래그를 지정해야 합니다. 다른 그룹의 플래그는 선택 사항입니다.

거래 모드

STGM_DIRECT플래그를 지정하면 액세스 및 공유 그룹에서 다음 플래그 조합 중 하나만 지정할 수 있습니다.

    STGM_READ      | STGM_SHARE_DENY_WRITE
    STGM_READWRITE | STGM_SHARE_EXCLUSIVE
    STGM_READ      | STGM_PRIORITY

직접 모드는 STGM_TRANSACTED 없음을 의미합니다. 즉, STGM_DIRECT 또는 STGM_TRANSACTED 지정되지 않은 경우 STGM_DIRECT 가정합니다.

STGM_TRANSACTED 플래그를 지정하면 개체가 트랜잭션 모드로 생성되거나 열립니다. 이 모드에서는 개체에 대한 변경 내용이 커밋될 때까지 유지되지 않습니다. 예를 들어 트랜잭션된 스토리지 개체에 대한 변경 내용은 IStorage::Commit 메서드가 호출될 때까지 유지되지 않습니다. Commit 메서드를 호출하기 전에 스토리지 개체를 해제(최종 릴리스)하거나 IStorage::Revert 메서드가 호출되면 이러한 스토리지 개체에 대한 변경 내용이 손실됩니다.

개체가 트랜잭션 모드에서 만들어지거나 열리면 필요한 경우 업데이트를 되돌릴 수 있도록 구현에서 원래 데이터와 이 데이터에 대한 업데이트를 모두 유지해야 합니다. 일반적으로 변경 내용이 커밋될 때까지 스크래치 영역에 변경 내용을 작성하거나 가장 최근에 커밋된 데이터의 스냅샷라는 복사본을 만들어 수행됩니다.

루트 스토리지 개체가 트랜잭션 모드로 열리면 스크래치 데이터 및 스냅샷 복사본의 위치와 동작을 제어하여 STGM_NOSCRATCHSTGM_NOSNAPSHOT 플래그로 성능을 최적화할 수 있습니다. (예를 들어 StgOpenStorageEx 함수에서 루트 스토리지 개체를 가져옵니다. IStorage::OpenStorage 메서드에서 가져온 스토리지 개체는 하위 저장소 개체입니다.) 일반적으로 스크래치 데이터와 스냅샷은 스토리지와 별도로 임시 파일에 저장됩니다.

이러한 플래그의 효과는 루트 스토리지에 액세스하는 판독기 및/또는 기록기의 수에 따라 달라집니다.

"단일 기록기" 경우 쓰기 액세스를 위해 트랜잭션 모드 스토리지 개체가 열리고 파일에 대한 다른 액세스 권한이 없을 수 있습니다. 즉, 파일은 STGM_TRANSACTED, STGM_WRITE 또는 STGM_READWRITE 액세스 및 STGM_SHARE_EXCLUSIVE 공유를 사용하여 열립니다. 이 경우 스토리지 개체에 대한 변경 내용이 스크래치 영역에 기록됩니다. 이러한 변경 내용이 커밋되면 원래 스토리지에 복사됩니다. 따라서 스토리지 개체를 실제로 변경하지 않으면 불필요한 데이터 전송이 없습니다.

"다중 작성기" 경우 트랜잭션된 스토리지 개체는 쓰기 액세스를 위해 열리지만 다른 작성기를 허용하는 등의 방식으로 공유됩니다. 즉, 스토리지 개체는 STGM_TRANSACTED, STGM_WRITE 또는 STGM_READWRITE 액세스 및 STGM_SHARE_DENY_READ 공유를 사용하여 열립니다. 대신 STGM_SHARE_DENY_NONE 공유를 지정하면 사례는 "다중 작성기, 다중 판독기"입니다. 이러한 경우 열려 있는 작업 중에 원래 데이터의 스냅샷 수행됩니다. 따라서 실제로 스토리지를 변경하지 않거나 다른 기록기가 실제로 동시에 열지 않더라도 열려 있는 동안에도 데이터 전송이 필요합니다. 따라서 스토리지 개체를 STGM_SHARE_DENY_WRITE 또는STGM_SHARE_EXCLUSIVE 모드로 열어 최상의 오픈 타임 성능을 얻을 수 있습니다. 여러 기록기가 있을 때 변경 내용이 커밋되는 방법에 대한 자세한 내용은 IStorage::Commit을 참조하세요.

"단일 작성기, 다중 판독기" 경우 트랜잭션된 스토리지 개체는 쓰기 액세스를 위해 열리지만 판독기와 공유됩니다. 즉, 스토리지 개체는 STGM_TRANSACTED, STGM_READWRITE 또는 STGM_WRITE 액세스 및 STGM_SHARE_DENY_WRITE 공유를 사용하여 작성기에 의해 열립니다. 스토리지는 STGM_TRANSACTED, STGM_READ 액세스 및 STGM_SHARE_DENY_NONE 공유를 통해 독자가 엽니다. 이 경우 기록기는 스크래치 영역을 사용하여 커밋되지 않은 변경 내용을 저장합니다. 위의 경우와 같이 데이터의 스냅샷 복사본이 만들어지는 동안 판독기에서 공개 시간 성능 저하가 발생합니다.

일반적으로 스크래치 영역은 원래 데이터와 분리된 임시 파일입니다. 변경 내용이 원래 파일에 커밋되면 임시 파일에서 데이터를 전송해야 합니다. 이 데이터 전송을 방지하기 위해 STGM_NOSCRATCH플래그를 지정할 수 있습니다. 이 플래그를 지정하면 스토리지 개체 파일의 일부가 별도의 임시 파일이 아닌 스크래치 영역에 사용됩니다. 따라서 데이터 전송이 거의 필요하지 않으므로 변경 내용을 빠르게 커밋할 수 있습니다. 단점은 스토리지 파일이 원래 데이터와 스크래치 영역 모두에 대해 충분히 커야 하므로 그렇지 않은 경우보다 커질 수 있다는 것입니다. 데이터를 통합하고 이 불필요한 영역을 제거하려면 STGM_NOSCRATCH 플래그를 설정하지 않고 트랜잭션 모드에서 루트 스토리지를 다시 엽니다. 그런 다음, STGC_CONSOLIDATE 플래그 집합을 사용하여 IStorage::Commit을 호출합니다.

스크래치 영역과 같은 스냅샷 영역도 일반적으로 임시 파일이며 이 영역도 STGM 플래그의 영향을 받을 수 있습니다. STGM_NOSNAPSHOT 플래그를 지정하면 별도의 임시 스냅샷 파일이 만들어지지 않습니다. 대신 개체당 하나 이상의 기록기가 있더라도 원래 데이터는 수정되지 않습니다. 변경 내용이 커밋되면 파일에 추가되지만 원래 데이터는 그대로 유지됩니다. 이 모드는 열기 작업 중에 스냅샷 만들기의 요구 사항을 제거하여 런타임을 줄이기 때문에 효율성을 높입니다. 그러나 이 모드를 사용하면 파일의 데이터를 덮어쓸 수 없으므로 매우 큰 스토리지 파일이 발생할 수 있습니다. 이는 NoSnapshot 모드에서 열린 파일의 크기에 제한이 없습니다.

Direct 단일 작성기, Multiple-Reader 모드

설명한 대로 해당 개체가 트랜잭션 모드로 열려 있는 경우 스토리지 개체의 단일 작성기 및 여러 판독기를 가질 수 있습니다. 또한 STGM_DIRECT_SWMR 플래그를 지정하여 직접 모드에서 단일 기록기 멀티레더 사례를 달성할 수도 있습니다.

STGM_DIRECT_SWMR 모드에서는 한 호출자가 읽기/쓰기 액세스를 위해 개체를 열 수 있고 다른 호출자는 읽기 전용 액세스를 위해 파일을 동시에 열 수 있습니다. STGM_TRANSACTED 플래그와 함께 이 플래그를 사용하는 것은 유효하지 않습니다. 이 모드에서 작성기는 다음 플래그가 있는 개체를 엽니다.

| STGM_DIRECT_SWMR | STGM_READWRITE STGM_SHARE_DENYWRITE

각 판독기에서 다음 플래그를 사용하여 개체를 엽니다.

| STGM_DIRECT_SWMR | STGM_READ STGM_SHARE_DENY_NONE

이 모드에서 스토리지 개체를 수정하려면 작성기에서 개체에 대한 단독 액세스 권한을 얻어야 합니다. 이는 모든 독자가 닫을 때 가능합니다. 작성기는 IDirectWriterLock 인터페이스를 사용하여 이 전용 액세스를 얻습니다.

단순 모드

단순 모드(STGM_SIMPLE)는 전체 저장 작업을 수행하는 애플리케이션에 유용합니다. 효율적이지만 다음과 같은 제약 조건이 있습니다.

  • 하위 저장소에 대한 지원이 없습니다.
  • 스토리지 개체 및 해당 개체에서 가져온 스트림 개체는 마샬링할 수 없습니다.
  • 각 스트림의 크기는 최소입니다. 스트림이 해제될 때 최소 바이트보다 적은 수의 바이트가 스트림에 기록되면 스트림이 최소 크기로 확장됩니다. 예를 들어 특정 IStream 구현의 최소 크기는 4KB입니다. 스트림이 만들어지고 1KB가 기록됩니다. 해당 IStream의 최종 릴리스에서 스트림 크기는 자동으로 4KB로 확장됩니다. 그런 다음 스트림을 열고 IStream::Stat 메서드를 호출하면 크기가 4KB로 표시됩니다.
  • IStorage 또는 IStream의 모든 메서드가 구현에서 지원되지는 않습니다. 자세한 내용은 IStorage - 복합 파일 구현IStream - 복합 파일 구현을 참조하세요.

마샬링 은 RPC(원격 프로시저 호출) 내에서 스레드 또는 프로세스 경계를 넘어 인터페이스 메서드 매개 변수를 패키징, 패키징 해제 및 보내는 프로세스입니다. 자세한 내용은 마샬링 세부 정보인터페이스 마샬링을 참조하세요.

단순 모드에서 만들기 작업으로 스토리지 개체를 가져오는 경우:

  • 스트림 요소는 만들 수 있지만 열 수는 없습니다.
  • IStorage::CreateStream을 호출하여 스트림 요소를 만드는 경우 해당 스트림 개체가 해제될 때까지 다른 스트림을 만들 수 없습니다.
  • 모든 스트림이 작성되면 IStorage::Commit 을 호출하여 변경 내용을 플러시합니다.

단순 모드에서 열기 작업으로 스토리지 개체를 가져오는 경우:

  • 한 번에 하나의 스트림 요소만 열 수 있습니다.
  • IStream::SetSize 메서드를 호출하거나 스트림의 끝 부분을 검색하거나 작성하여 스트림의 크기를 변경할 수 없습니다. 그러나 모든 스트림의 크기가 최소이므로 원래 적은 데이터가 기록되더라도 해당 크기까지 스트림을 사용할 수 있습니다. 스트림의 크기를 확인하려면 IStream::Stat 메서드를 사용합니다.

스토리지 요소가 단순 모드가 아닌 스토리지 개체에 의해 수정되면 해당 스토리지 요소를 단순 모드로 열 수 없습니다.

요구 사항

요구 사항
지원되는 최소 클라이언트
Windows 2000 Professional[데스크톱 앱만]
지원되는 최소 서버
Windows 2000 Server[데스크톱 앱만]
헤더
ObjBase.h

추가 정보

ISequentialStream::Read

IStorage

StgCreateDocfile

StgCreateDocfileOnILockBytes

StgCreateStorageEx

StgOpenStorage

StgOpenStorageEx

StgOpenStorageOnILockBytes