IStorage::Commit 메서드(objidl.h)

Commit 메서드는 트랜잭션 모드에서 열린 스토리지 개체에 대한 모든 변경 내용이 부모 스토리지에 반영되도록 합니다. 직접 모드의 비루트 스토리지 개체의 경우 이 메서드는 영향을 주지 않습니다. 루트 스토리지의 경우 실제 디바이스의 변경 내용을 반영합니다. 예를 들어 디스크의 파일입니다. 직접 모드로 열린 루트 스토리지 개체의 경우 릴리스 전에 항상 IStorage::Commit 메서드를 호출 합니다. IStorage::Commit 은 직접 모드에서 루트 스토리지에 대한 모든 메모리 버퍼를 디스크에 플러시하고 실패 시 오류 코드를 반환합니다. 또한 릴리스는 메모리 버퍼를 디스크로 플러시하지만 실패 시 오류 코드를 반환할 수 있는 용량이 없습니다. 따라서 Commit을 먼저 호출하지 않고 릴리스를 호출하면 확정되지 않은 결과가 발생합니다.

구문

HRESULT Commit(
  [in] DWORD grfCommitFlags
);

매개 변수

[in] grfCommitFlags

변경 내용이 스토리지 개체에 커밋되는 방식을 제어합니다. 이러한 값의 정의는 STGC 열거형을 참조하세요.

반환 값

이 메서드는 이러한 값 중 하나를 반환할 수 있습니다.

반환 코드 설명
S_OK 스토리지 개체에 대한 변경 내용이 부모 수준으로 성공적으로 커밋되었습니다. STGC_CONSOLIDATE 지정한 경우 스토리지가 성공적으로 통합되었거나 스토리지가 이미 너무 압축되어 추가로 통합할 수 없습니다.
STG_S_MULTIPLEOPENS 커밋 작업이 성공했지만 STGM_NOSNAPSHOT 플래그를 사용하여 여러 번 열렸기 때문에 스토리지를 통합할 수 없습니다.
STG_S_CANNOTCONSOLIDATE 커밋 작업이 성공했지만 잘못된 스토리지 모드로 인해 스토리지를 통합할 수 없습니다. 복합 파일의 경우 스토리지가 STGM_NOSCRATCH 플래그를 사용하여 열렸거나 스토리지가 가장 바깥쪽 트랜잭션 수준이 아닐 수 있습니다.
STG_S_CONSOLIDATIONFAILED 커밋 작업이 성공했지만 내부 오류(예: 메모리 할당 오류)로 인해 스토리지를 통합할 수 없습니다.
E_PENDING 비동기 스토리지만 해당: 커밋할 데이터의 일부 또는 전부를 현재 사용할 수 없습니다.
STG_E_INVALIDFLAG grfCommitFlags 매개 변수의 값이 잘못되었습니다.
STG_E_INVALIDPARAMETER 매개 변수 중 하나가 잘못되었습니다.
STG_E_NOTCURRENT 스토리지 개체의 또 다른 열린 instance 변경 내용을 커밋했습니다. 따라서 현재 커밋 작업은 이전 변경 내용을 덮어쓸 수 있습니다.
STG_E_MEDIUMFULL 커밋할 공간이 디바이스에 남아 있지 않습니다.
STG_E_TOOMANYOPENFILES 열려 있는 파일이 너무 많기 때문에 커밋 작업을 완료할 수 없습니다.
STG_E_REVERTED 스토리지 개체는 트랜잭션 트리에서 위의 되돌리기 작업에 의해 무효화되었습니다.

설명

IStorage::Commit 은 트랜잭션 모드에 있는 스토리지 개체를 영구적으로 변경합니다. 이 경우 변경 내용이 버퍼에 누적되고 이 메서드를 호출할 때까지 스토리지 개체에 반영되지 않습니다. 또는 변경 내용이 스토리지 개체에 즉시 반영되는 직접 모드로 개체를 여는 것입니다. 직접 모드에서 열린 개체는 스토리지 개체를 영구적으로 변경하기 위해 IStorage::Commit 을 호출할 필요가 없습니다. 직접 모드로 열린 비루트 스토리지에서 IStorage::Commit 메서드를 호출해도 아무런 효과가 없습니다. 직접 모드에서 루트 스토리지 개체를 열면 메모리 버퍼의 변경 내용이 기본 스토리지 디바이스에 기록됩니다.

커밋 작업은 이 스토리지 개체의 현재 변경 내용과 해당 자식을 스토리지 계층 구조의 다음 단계로 게시합니다. 커밋하기 전에 현재 변경 내용을 실행 취소하려면 IStorage::Revert 를 호출하여 마지막으로 커밋된 버전으로 롤백합니다.

IStorage::Commit을 호출해도 이 스토리지 개체의 현재 열린 중첩 요소에는 영향을 주지 않습니다. 유효한 상태로 유지되며 사용할 수 있습니다. 그러나 IStorage::Commit 메서드는 이러한 중첩된 요소에 대한 변경 내용을 자동으로 커밋하지 않습니다. 커밋 작업은 알려진 변경 내용만 스토리지 계층 구조의 다음 상위 수준에 게시합니다. 따라서 중첩된 수준에 대한 트랜잭션은 더 높은 수준으로 커밋되기 전에 이 스토리지 개체에 커밋되어야 합니다.

커밋 작업에서 커밋 프로세스 중에 데이터가 보호되도록 하는 단계를 수행해야 합니다.

  • 루트 스토리지 개체에 대한 변경 내용을 커밋할 때 호출자는 반환 값을 검사 작업이 성공적으로 완료되었는지 여부와 그렇지 않은 경우 IStorage의 커밋된 이전 콘텐츠가 그대로 유지되고 복원될 수 있는지 확인해야 합니다.
  • 일부 항목이 제외된 상태에서 이 스토리지 개체를 연 경우 호출자는 커밋을 호출하기 전에 다시 작성해야 합니다. 커밋이 성공하려면 스토리지 열기에 쓰기 모드가 필요합니다.
  • 동일한 스토리지 개체에서 여러 동시 작성기를 금지하지 않는 한 이 메서드를 호출하는 애플리케이션은 grfCommitFlags 매개 변수에 최소 STGC_ONLYIFCURRENT 지정하여 한 작성기의 변경 내용이 실수로 다른 작성기의 변경 내용을 덮어쓰지 않도록 해야 합니다.
스토리지 구현에서 STGC_CONSOLIDATE 플래그를 지원하지 않는 경우 grfCommitFlags 매개 변수에 지정된 STGC_CONSOLIDATE 사용하여 IStorage::Commit을 호출하면 STG_E_INVALIDFLAG 값이 반환됩니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000 Professional [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows 2000 Server [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 objidl.h
라이브러리 Uuid.lib
DLL Ole32.dll

추가 정보

IStorage - 복합 파일 구현

IStorage::Revert

STGC