Шаг 76 - Транзакции в хранилищах

Аналогичны транзакциям в базе данных. Очень кстати хорошее дело. Применительно для файлов. Для того, чтобы вы могли использовать транзакции при открытии хранилища необходимо использовать флаг STGM_TRANSACTED. Если Вы сделали так, то у вас появляется возможность подтверждать изменения или отменять их.

Commit-подтверждение транзакции:

HRESULT Commit
(  
	DWORD grfCommitFlags	//флаг подтверждения изменений
);

Revert - отказ от изменений:

HRESULT Revert(void);

И в той и в другой функции результат S_OK скажет, что все в порядке.

Смотрите в данном примере файл не создастся. В самый последний момент мы передумаем:

#include "stdafx.h"
#include "windows.h"
#include "ole2.h"
#include "iostream.h"

int main(int argc, char* argv[])
{
	OLECHAR filename[20];
	wcscpy(filename,L"test.stg");
	LPSTORAGE pIStorage=NULL;
	HRESULT rez;
	rez=StgOpenStorage(filename,NULL, STGM_READWRITE |
		STGM_SHARE_EXCLUSIVE | STGM_TRANSACTED ,NULL,0,&pIStorage);

	if (!FAILED(rez))
	{
         
	     LPSTREAM stream =  NULL;
		 HRESULT hresult = pIStorage->CreateStream(L"MyFileNew",
			STGM_READWRITE|STGM_SHARE_EXCLUSIVE|STGM_CREATE,0, 0, &stream);
		 pIStorage->Revert(); 
         stream->Release();  
 		 pIStorage->Release(); 
	}
	else cout << "Error open" << endl;
	return 0;
}

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.