Поделиться через


реализация файла IStorage-Compound

Реализация составного файла IStorage позволяет создавать дочерние журналы и потоки в объекте хранилища, который находится в составном объекте файла. Чтобы создать составной объект файла и получить указатель IStorage, вызовите функцию API StgCreateStorageEx. Чтобы открыть существующий составной файловый объект и получить корневой указателя IStorage, вызовите StgOpenStorageEx.

Приложения, использующие составное хранилище, должны быть зарегистрированы в HKEY_CLASSES_ROOT\SystemFileAssociations и должны предоставлять собственные обработчики свойств. Дополнительные сведения см. в разделе "Регистрация команд и других сведений о сопоставлении файлов" регистрации приложений.

Когда следует использовать

Большинство приложений используют эту реализацию для создания хранилищ и потоков и управления ими.

Методика

IStorage::CreateStream

Создает и открывает объект потока с указанным именем, содержащимся в этом объекте хранилища. Имя не должно превышать 31 символов длины (не включая строковый терминатор). 000–01f символов, которые служат первым символом имени потока или хранилища, зарезервированы для использования OLE. Это составное ограничение файла, а не структурированное ограничение хранилища. Реализация составного файла com для метода IStorage::CreateStream не поддерживает следующее поведение:

  • Флаг STGM_DELETEONRELEASE не поддерживается.
  • Режим транзакций (STGM_TRANSACTED) не поддерживается для объектов потока.
  • Открытие одного потока несколько раз из одного хранилища не поддерживается. Флаг STGM_SHARE_EXCLUSIVE режима общего доступа должен быть указан в параметре grfMode.

IStorage::OpenStream

Открывает существующий объект потока в этом объекте хранилища с помощью режимов доступа, указанных в параметре grfMode. 000–01f символов, которые служат первым символом имени потока или хранилища, зарезервированы для использования OLE. Это составное ограничение файла, а не структурированное ограничение хранилища. Реализация составного файла COM метода IStorage::OpenStream не поддерживает следующее поведение:

  • Флаг STGM_DELETEONRELEASE.
  • Режим транзакций (STGM_TRANSACTED) для объектов потока.
  • Открытие одного потока несколько раз из одного хранилища. Необходимо указать флаг STGM_SHARE_EXCLUSIVE.

IStorage::CreateStorage

Создает и открывает новый объект хранилища с указанным именем в указанном режиме доступа. Имя не должно превышать 31 символов длины (не включая строковый терминатор). 000–01f символов, которые служат первым символом имени потока или хранилища, зарезервированы для использования OLE. Это составное ограничение файла, а не структурированное ограничение хранилища. Реализация составного файла COM метода IStorage::CreateStorage не поддерживает следующее поведение:

  • Флаг STGM_PRIORITY для хранилищ, не являющихся ролями.
  • Открытие одного объекта хранилища несколько раз из одного родительского хранилища. Необходимо указать флаг STGM_SHARE_EXCLUSIVE.
  • Флаг STGM_DELETEONRELEASE. Если этот флаг указан, функция возвращает STG_E_INVALIDFLAG.

IStorage::OpenStorage

Открывает существующий объект хранилища с указанным именем в указанном режиме доступа. 000–01f символов, которые служат первым символом имени потока или хранилища, зарезервированы для использования OLE. Это составное ограничение файла, а не структурированное ограничение хранилища. Реализация составного файла com для метода IStorage::OpenStorage не поддерживает следующее поведение:

  • Флаг STGM_PRIORITY для хранилищ, не являющихся ролями.
  • Открытие одного объекта хранилища несколько раз из одного родительского хранилища. Необходимо указать флаг STGM_SHARE_EXCLUSIVE.
  • Флаг STGM_DELETEONRELEASE. Если этот флаг указан, функция возвращает STG_E_INVALIDFUNCTION.

IStorage::CopyTo

Копирует только вложенные журналы и потоки этого открытого объекта хранилища в другой объект хранилища. Параметр rgiidExclude можно задать для IID_IStream копирования только вложенных журналов или IID_IStorage для копирования только потоков.

IStorage::MoveElementTo

Копирует или перемещает вложенный журнал или поток из этого объекта хранилища в другой объект хранилища.

IStorage::Commit

Гарантирует, что все изменения, внесенные в объект хранилища, открытые в режиме транзакций, отражаются в родительском хранилище; для корневого хранилища отражает изменения на фактическом устройстве; например, файл на диске. Для объекта корневого хранилища, открытого в прямом режиме, этот метод не действует, кроме очистки всех буферов памяти на диск. Для объектов хранения, не относящихся к сети, в прямом режиме этот метод не действует.

Реализация составных файлов COM использует двухфазный процесс фиксации, если STGC_OVERWRITE не указано в параметре grfCommitFlags. Этот двухэтапный процесс обеспечивает надежность данных, если операция фиксации завершается ошибкой. Во-первых, все новые данные записываются в неиспользуемое пространство в базовом файле. При необходимости новое пространство выделяется файлу. После завершения этого шага таблица в файле обновляется с помощью операции записи в одном секторе, чтобы указать, что новые данные будут использоваться вместо старого. Старые данные становятся свободным местом для использования в следующей операции фиксации. Таким образом, старые данные доступны и могут быть восстановлены, если при фиксации изменений возникает ошибка. Если указана STGC_OVERWRITE, используется одна фазовая операция фиксации. Дополнительные сведения о флагах режима транзакций см. в перечислении stGC.

IStorage::Revert

Отменяет все изменения, внесенные в объект хранилища с момента последней операции фиксации.

IStorage::EnumElements

Создает и извлекает указатель на объект перечислителя, который можно использовать для перечисления объектов хранилища и потоков, содержащихся в этом объекте хранилища. Реализация составного файла COM принимает моментальный снимок этих сведений. Поэтому изменения потоков и хранилищ не отражаются в перечислителе до получения нового перечислителя.

IStorage::D etorementElement

Удаляет указанный элемент (substorage или stream) из этого объекта хранилища.

IStorage::RenameElement

Переименовывает указанный вложенный журнал или поток в этом объекте хранилища. 000–01f символов, которые служат первым символом имени потока или хранилища, зарезервированы для использования OLE. Это составное ограничение файла, а не структурированное ограничение хранилища.

IStorage::SetElementTimes

Задает время изменения, доступа и создания указанного элемента хранилища. Реализация составного файла COM поддерживает изменение и время изменения для внутренних объектов хранилища. Объекты корневого хранилища поддерживают все, что поддерживается базовой файловой системой (или ILockBytes). Реализация составного файла не поддерживает метки времени для внутренних потоков. Неподдерживаемые метки времени сообщаются как ноль, что позволяет вызывающему объекту тестировать поддержку.

IStorage::SetClass

Назначает указанный CLSID этому объекту хранилища.

IStorage::SetStateBits

Хранит до 32 битов сведений о состоянии в этом объекте хранилища. Состояние, заданное этим методом, предназначено только для внешнего использования. Реализация составного файла COM не выполняет никаких действий на основе состояния.

IStorage::Stat

Извлекает структуруSTATSTG для этого открытого объекта хранилища.

Замечания

Если объект хранилища открыт в простом режиме, использование указанных выше методов ограничено. Хранилище находится в простом режиме, если оно открыто с элементом STGM_SIMPLE, указанным в параметре grfMode функции StgCreateStorageEx или StgOpenStorageEx. Дополнительные сведения о хранилищах в простом режиме см. в константы STGM. Если объект хранилища в простом режиме был получен из функции StgCreateStorageEx, метод CreateStream можно вызвать, но метод OpenStream невозможно. Если объект хранилища в простом режиме был получен из функции StgOpenStorageEx, метод OpenStream можно вызвать, но метод CreateStream не удается.

Если объект хранилища в простом режиме используется для создания потока, минимальный размер этого потока обычно составляет 4096 байт. Если в поток записывается меньше данных, размер округляется до 4096 байт.

ограничения реализации составных файлов

IFillLockBytes

ILockBytes

IRootStorage

IStorage

IStream

StgCreateDocfile

StgCreateStorageEx

StgOpenStorage

StgOpenStorageEx