Перманентность, структурированное хранилище, хранилище и потоки
Перманентность
СОМ-объекты состоят из методов и данных, и могут встречаться такие из них, которым необходимо сохранять свои данные в течение периода неактивности. В подобных случаях объекту необходимо сделать свои данные перманентными (persistent), что обычно означает их запись на диск. СОМ-объекты могут делать это разными путями, но наиболее часто для этих целей используется структурированное хранилище (Structured Storage).
Перманентность данных позволяет объекту прекращать свою работу и, когда экземпляр объекта будет создан снова, продолжить его работу с того же места, просто загрузив перманентные данные. Экземпляр объекта будет конечно новым, но за счет загрузки перманентных данных он будет идентичен ранее закончившему работу. Механизм, с помощью которого объекты сохраняют и загружают свои перманентные данные, иногда называют сервисом перманентности (persistent service). Ряд объектов в состоянии автономно определять, когда делать свои данные перманентными, а для других бывает нужно указать, когда сохранять и загружать свои данные.
Таким образам, проблема перманентности распадается на две: предоставление объектам способа сохранения и загрузки своих перманентных данных, и наделение клиентов таких объектов возможностью управлять тем, когда (и, может быть, где) эти данные сохраняются и загружаются. Применительно к СОМ-объектам эти два аспекта перманентности решаются определением двух разных наборов интерфейсов:
• первый — предоставляет СОМ-объектам некий конкретный способ хранения перманентных данных;
• второй — позволяет клиенту управлять перманентностью объекта. Объект может поддерживать один или несколько таких интерфейсов, объединенных под общим названием интерфейсы IPersist.
Структурированное хранилище
Структурированное хранилище используется тогда, когда несколько объектов хранят перманентные данные в одном общем файле
Хранилища и потоки
Один файл структурированного хранилища состоит из хранилищ (storage), выступающих в роли каталогов, и потоков (stream), играющих роль логических файлов. Реализация файлов подобной структуры в Microsoft Windows называется составными файлами (compound file).
Каждый составной файл содержит корневое хранилище, в котором могут располагаться другие потоки и хранилища. В этих хранилищах в свою очередь могут быть дополнительные потоки, хранилища и т.д. Каждому элементу программного обеспечения, использующему общий составной файл, можно выделить отдельный поток и даже дополнительное хранилище.
Так как для каждого компонента общей программы можно выделить отдельную область для хранения перманентных данных, то вместе они могут использовать один общий файл.
Нет предварительной организации байтов внутри потоков, ни подразделения на отдельные записи, структуры, подпотоки или чти либо еще. Организация данных возлагается на само приложение.
В СОМ технологии хранилища и потоки рассматриваются как СОМ объекты, и доступ к каждому из них осуществляется через соответствующие интерфейсы. Хранилища поддерживают интерфейс IStorage, а потоки — им терфейс IStream.
Транзакции
По определению и хранилища, и потоки предназначены для открытия как в непосредственном (direct) или транзакционном (transacted) режимах. Обычно хранилища обязаны поддерживать транзакционный режим, а потоки — нет. Транзакционный режим используется, в частности при внедрении, например, таблицы Excel в документе WinWord. После редактирования таблицы не происходит автоматического запоминания изменений, а пользователю предлагается подтвердить или отказаться от сохранения изменений
Управление перманентностью объекта
На практике решение о загрузке или сохранении данных чаще всего принимает клиент. Например, WinWord запрашивает интерфейсы СОМ-серверов, чьи данные внедрены в его документ Создатель объекта выбирает, какие из них будут поддерживаться объектом, на основании того, как объект сохраняет свои перманентные данные. Среди возможных интерфейсов можно отметить следующие:
• IPersistStream позволяет запросить загрузку перманентных данных объекта и сохранение их в поток. Обычно используется для однопотоковых перманентных данных.
• IPersistStorage позволяет запросить у объекта загрузку и сохранение его перманентных данных с использованием хранилища при нескольких потоках. Именно этот поток запрашивает WinWord у Excel.
• IPersistFile позволяет сохранять данные в простом файле.
• IPersistMemory позволяет сохранять данные в оперативной памяти.
Часто объект поддерживает несколько подобных интерфейсов. Когда клиент инициализирует объект, то первым запрашиваемым указателем интерфейсом объекта обычно бывает один из интерфейсов IPersist*. Затем клиент вызывает методы этого интерфейса для загрузки данных объекта.
Работа с хранилищами и потоками в Delphi
а) Создание хранилища
Var pSg: IStorage; // Указатель на интерфейс IStorage
StgCreateDocFile()
б) Открытие хранилища
OleCheck(StgOpenStorage());
в) Создание потока
Var pSm: IStream; // Указатель на интерфейс IStream
OleCheck(pSg.CreateStream());
г) Открытие потока
OleCheck(pSg.OpenStream());
д) Запись данных в поток методами интерфейса IStream
pSm.Write();
е) Считывание данных из потока методами интерфейса IStream
pSm.Read();
Использование классов Delphi для работы с потоками
В Delphi имеется несколько классов, которые могут быть использованы для обмена данными с потоками докфайлов. Среди них:
• TOleStream — объявлен в блоке AxCtrls и представляет собой надстройку над интерфейсом IStream, включающую методы (Read, Write, Seek) и позволяющую взаимодействовать с потоком докфайла с помощью тех же методов, что и при работе со стандартными потоками Delphi.
• TWriter, TReader — специализированные классы, объявленные в блоке Classes, для записи (методы Write***) и чтения (методы Read***)