Денис Абросимов где-то в 2001 Compaund-файл представляет из себя хранилище OLE-документов,
что-то вроде архива. Он состоит из корневого storage файла,
который может содержать другие storage и stream'ы объекты (по русски,
соответственно, папки и файлы). В MFC Compaund-файлы поддерживаются классами
COleStreamFile и ColeDocument.
В качестве места складирования данных Compaund-файлы используются в основном в
поделках Микрософта Excel, Word, Power Point. Видимо, чтобы не отстать от лидера
софтостроения, отечественные девелоперы из незабвенной фирмы 1С для своего бухгалтерского
детища избрали такой же способ хранения информации.
Compaund-файл включает в себя три составляющие stream-объекты,
storage-объекты и ILockBytes-объекты. Как я уже упоминал,
storage это директории, хранящие в своих недрах stream'ы. LockBytes это
некая прослойка между storage и физической файловой системой.
Итак, получим доступ к содержимому Compaund'а на примере некоего файла с загадочным
расширением md. Для этого воспользуемся функцией StgOpenStorage
функцией открытия корневого storage. Внутренние storage можно открыть, используя
родительский метод Istorage::OpenStorage.
Формат:
WINOLEAPI StgOpenStorage(
const WCHAR *pwcsName,
IStorage *pstgPriority,
DWORD grfMode,
SNB snbExclude,
DWORD reserved,
IStorage **ppstgOpen
);
Параметры:
- pwcsName
Указатель на файл, содержащий storage. Параметр игнорируется, если pStgPriority
не NULL.
- pstgPriority
Обычно NULL. Используется для повторного открытия при наличии интерфейса Istorage.
- grfMode
Режим доступа к storage.
- snbExclude
Обычно NULL, но может использоваться для исключения объектов из хранилища.
- reserved
Для возможного использования в будущем. Пока ноль.
- ppstgOpen
Интерфейс IStorage, который возвращается при удачном вызове.
Итак, откроем наш MD-файл. Программу Compound Extractor можно скачать
вот отсюда.
Исходный текст программы можно найти вот здесь.
В результате программа извлекает на свет божий нужный нам stream-файл.
Более подробно о функциях работы с compound-файлами можно узнать в MSDN,
а по-русски на http://www.firststeps.ru/.
|