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