IDirectWriterLock - 복합 파일 구현

IDirectWriterLock의 복합 파일 구현은 단일 작성기 및 여러 판독기를 사용하여 직접 모드에서 복합 파일을 여는 방법을 제공합니다.

복합 파일은 STGM_DIRECT 플래그를 사용하여 직접 모드로 열 수 있습니다. IDirectWriterLock 인터페이스는 STGM_READWRITE| 설정합니다. STGM_SHARE_DENY_WRITE 스냅샷 복사본의 오버헤드 없이 직접 모드에서 유효한 플래그입니다.

STGM_TRANSACTED 플래그를 사용하여 복합 파일을 트랜잭션 모드로 열면 STGM_READWRITE| 사용하여 여러 판독기 및 단일 작성기를 가질 수도 있습니다. STGM_SHARE_DENY_WRITE 플래그입니다. 그러나 이 경우 판독기를 위해 파일의 스냅샷 복사본이 만들어집니다. 종종 스크래치 복사본의 오버헤드가 있습니다.

사용 시기

STGM_READWRITE| 직접 모드(STGM_DIRECT)로 스토리지를 열 때 시스템 제공 IDirectWriterLock 구현 사용 플래그를 STGM_SHARE_DENY_WRITE.

IDirectWriterLock에 대한 포인터를 가져오려면 IStorage에서 QueryInterface를 호출하여 복합 파일에 대한 루트 스토리지 개체를 가져옵니다.

IDirectWriterLock::WaitForWriteAccess를 호출하여 복합 파일에 대한 단독 쓰기 액세스 권한을 얻습니다. IDirectWriterLock::ReleaseWriteAccess를 호출하여 단독 쓰기 액세스를 해제합니다.

IDirectWriterLock::HaveWriteAccess 는 파일이 현재 잠겨 있는지 여부를 나타냅니다.

설명

단일 기록기 다중 판독기 기능의 복합 파일 구현은 범위 잠금을 기반으로 합니다. 기록기는 모든 현재 판독기가 스토리지를 닫은 후에 쓸 스토리지에 대한 단독 액세스 권한을 얻습니다. 작성기가 활성 상태이면 후속 판독기는 스토리지를 열 수 없습니다. 작성기는 IDirectWriterLock::WaitForWriteAccess 를 호출하여 단독 쓰기 액세스 권한을 얻습니다. 그런 다음 기록기는 IDirectWriterLock::ReleaseWriteAccess 를 호출하여 스토리지를 해제해야 합니다.

이 단일 판독기 다중 작성기 모드에서 쓰기 전에 IDirectWriterLock::WaitForWriteAccess 에 대한 호출이 필요합니다. IDirectWriterLock::WaitForWriteAccess를 호출하지 않고 파일에 쓰려고 하면 STG_E_ACCESSDENIED. 이 오류는 기록기가 처음에 파일을 열었으며 현재 열려 있는 판독기가 없는 경우에도 반환됩니다.

마샬링 고려 사항

사용자 지정 마샬링은 일반적으로 복합 파일이 동일한 컴퓨터의 다른 프로세스로 마샬링될 때 사용됩니다. 스토리지를 마샬링할 때 액세스 권한은 고려되지 않으며 IStorage 포인터는 원래 마샬링 프로세스와 동일한 액세스 모드 및 권한으로 새 프로세스에 전달됩니다. 액세스 모드에 대한 자세한 내용은 STGM 상수입니다. 마샬링하는 동안 단독 쓰기 액세스를 보장하기 위해 잠금을 수행하거나 확인하지 않습니다. 이 경우 단일 작성기, 다중 판독기 모드에서 열린 복합 파일에 대한 단일 작성기 정책이 적용되지 않습니다. 대신, 적용은 복합 파일 구현에 의해 내부적으로 처리됩니다.

IStorage 포인터는 마샬링하는 동안 다른 프로세스에 전달되므로 두 프로세스가 동일한 복합 파일에 동시에 액세스할 수 있습니다. 호출자가 IDirectWriterLock::WaitForWriteAccess를 호출하여 스토리지에 대한 단독 쓰기 액세스 권한을 얻었을 수도 있지만 마샬링된 버전도 동시에 액세스할 수 있습니다. 마샬링된 버전은 단일 작성기가 파일에 액세스하는 동안 강제로 닫지 않습니다. 이 경우 복합 파일 구현은 내부적으로 쓰기를 동기화합니다.

단일 작성 기가 IDirectWriterLock::WaitForWriteAccess를 호출하여 단독 액세스를 얻는 경우 마샬링된 스토리지에도 쓰기 권한이 있으며 IDirectWriterLock::WaitForWriteAccess를 호출할 필요가 없습니다. 두 프로세스 모두 쓰기 액세스 권한을 가지며 동기화는 내부 복합 파일 구현에 의해 제어됩니다.

IDirectWriterLock