Шаг 62 - Открытие и закрытие хранилища - получение интерфейса

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

LPSTORAGE temp=NULL;
OLECHAR filename[20];
wcscpy(filename,L"test.stg");
HRESULT hr=StgCreateDocfile(filename, STGM_CREATE | STGM_WRITE | STGM_SHARE_EXCLUSIVE,0,&temp);

В temp мы получили интерфейс. Вы не обратили внимания на то, что нет функции CLOSE ??? Её и не будет. Хотя прекращать работу с хранилищем надо. Для того, чтобы прекратить работу с хранилищем нужно вызвать метод Release() интерфейса. И это общее правило для COM объектов. А работа с хранилищем - это работа с COM объектами.

StgCreateDocfile
	Работа
Release

StgOpenStorage
	Работа
Release

pIStorage->EnumElements(0,NULL,0,&lpEnum); 
	Работа
Release

Еще раз, работа с хранилищами это работа с интерфейсами. И после использования интерфеса его необходимо закрыть с помощью Release(). Вы же помните, что при обращении к объекту вызывается функция AddRef(), которая увеличивает счетчик обращений ?? Release() уменьшает этот счетчик. Если функцию Release() не вызвать, то механизм работы с объектами OLE - COM будет болтаться в памяти и думать, что с ним еще кто-то работает, хотя от вашей программы уже и след простыл.


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