Итак, у нас есть хранилище. Мы умеем его создавать и открывать. Только наше хранилище пока пустое. Я еще упоминал, что многое программное обеспечение Microsoft хранит данные именно так. То есть организует хранилище куда и помещает свои данные. Не знаю как все программное обеспечение, но WORD точно. Итак, пока не вдаваясь в подробности. Открыв хранилище и получив к нему интерфейс мы можем получить интерфейс к перечислителям EnumElements, а у этого перечислителя есть метод Next. С помощью него можно перебирать содержимое хранилища. Если это понятно, то вот код. Не вдавайтесь в детали пока. Главное просто посмотреть сейчас как это работает. Я создал документ WORD и поместил в него текст и графику. Вы можете использовать любой. Вот пример.
#include "stdafx.h" #include "windows.h" #include "ole2.h" #include "iostream.h" int main(int argc, char* argv[]) { OLECHAR filename[20]; wcscpy(filename,L"1.xls"); LPSTORAGE pIStorage=NULL; HRESULT rez; rez=StgOpenStorage(filename,NULL, STGM_READ | STGM_SHARE_EXCLUSIVE,NULL,0,&pIStorage); if (!FAILED(rez)) { cout << "Ok open" << endl; LPENUMSTATSTG lpEnum=NULL; pIStorage->EnumElements(0,NULL,0,&lpEnum); if (lpEnum!=NULL) { cout << "Ok enum" << endl; ULONG uCount; STATSTG stat; while (lpEnum->Next(1,&stat,&uCount)==S_OK) { cout << (LPSTR)stat.pwcsName << endl; } lpEnum->Release(); } else cout << "Error enum" << endl; pIStorage->Release(); } else cout << "Error open" << endl; return 0; }
Результат его работы такой.
Ok open Ok enum D 1 M O W Press any key to continue
Ну очень впечатляет. Самое главное, что это хранилище. Открылось и сработало. Если хотите видеть нормальные надписи, то смотрите "Шаг 57 - OLECHAR в CHAR и обратно", о том как конвертировать символы. То же самое будет работать для Excel. Попробуйте.
Обратите внимание на сигнатуру файлов. Они все начинаются с РП. Вот такие файлы и есть хранилища и с ними можно работать указанными методами.