Шаг 9.
Технология OLE. Интерфейсы памяти

    На этом шаге мы рассмотрим интерфейсы памяти.

    Существует ряд интерфейсных методов, используемых для доступа к структурной памяти OLE. Эти интерфейсы перечислены в таблице 1. В этой таблице приводятся интерфейсы, их реализация и компоненты, которые их используют (контейнер, сервер, контейнер и сервер, OLE или кто-нибудь еще).

Таблица 1. Интерфейсы структурной и обычной памяти
Интерфейс Реализация >Кто использует
IEnumSTATSTG
OLE
Используется, когда необходимо задать перечисление объектов IStorage. В составных файлах элементы будут состоять из субпамяти и потоков. Вы также можете вызвать функцию IStorage::EnumElements() для того, чтобы получить указатель на интерфейс IEnumSTATSG
ILockBytes
OLE
Несмотря на то, что интерфейс ILockBytes может использоваться и в приложениях, в основном он используется OLE в качестве метода манипуляции массивами байтов, лежащими в основе составных файлов
IMalloc
OLE
Используется для управления распределением памяти для приложений OLE. Интерфейс IMalloc жизненно важен, ниже он описывается более детально
IPersist
Обработчики объектов и приложения объектов Может использоваться для получения CLSID данного объекта. Интерфейсы IPersistStorage, IPersistStream и IPersistFile базируются на интерфейсе IPersist
IPersistFile
Приложения объектов и (необязательно) приложения контейнеров для поддержки компоновки с внедренными и файловыми объектами Используется OLE для загрузки объектов документов внешнего уровня, которые размещаются в файлах, в отличие от документов, внедренных внутрь составного документа
IPersistStorage
Обработчики объектов и приложения объектов Используется контейнерными приложениями для чтения и записи, собственно данных объектов составных документов, которые находятся в интерфейсе IStorage
IPersistStream
OLE
Используется контейнерными приложениями для чтения и записи объектов, хранящихся в потоковой памяти
IRootStorage
OLE
Используется контейнерными приложениями для переключения между дисковыми файлами, лежащими в основе объектов IStorage
IStorage
OLE
Используется для связи с объектом структурной памяти. Интерфейс IStorage очень важен, ниже он описывается более детально
IStream
OLE
Используется для связи с потоковыми объектами, находящимися в объекте IStorage. Вы можете рассматривать объект IStream во многом подобным несоставному файлу

    Далее мы рассмотрим интерфейсы IMalloc и IStorage.

    Составными файлами можно манипулировать с помощью указателя на объект интерфейса IStorage. В листинге 1 интерфейс IStorage используется для взаимодействия с объектами структурной памяти.

    Листинг 1. Интерфейс IStorage

DECLARE INTERFACE_ (IStorage, IUnknown)
{
// *** методы IUnknown ***
HRESULT QueryInterface (THIS_ REFIID riid,   LPVOID FAR* ppvObj);
ULONG AddRef (THIS);
ULONG Release (THIS);
// *** методы IStorage ***
HRESULT CreateStream(THIS_ const char FAR* pwcsName,   DWORD grfMode,
          DWORD dwReserved1,  DWORD dwReserved2,   LPTSTREAM FAR* ppStm);
HRESULT OpenStream(THIS_ const char FAR* pwcsName,  void FAR *pReserved1,
          DWORD grfMode,   DWORD dwReserved2,   LPTSTREAM FAR* ppStm);
HRESULT CreateStorage(THIS_ const char FAR* pwcsName,  DWORD grfMode,
          DWORD dwReserved1, DWORD dwReserved2, LPTSTORAGE FAR* ppStg);
HRESULT OpenStorage(THIS_ const char FAR* pwcsName,
          LPSTORAGE FAR *pstgPriority, DWORD grfMode,  
          SNB snbExclude,  DWORD dwReserved,   LPTSTORAGE FAR* ppStg);
HRESULT CopyTo(THIS_ DWORD dwCiidExclude,   IID const FAR *rgiidExclude,
          SNB snbExclude,   LPSTORAGE FAR* pStgDest);
HRESULT MoveElementTo(THIS_ const char FAR* ipszName,
          LPSTORAGE FAR *pStgDest,
          const char FAR* lpszNewName,  DWORD grfFlags);
HRESULT Commit(THIS_ DWORD grfCommitFlags);
HRESULT Revert(THIS);
HRESULT EnumElements(THIS_ DWORD dwReserved1,   void FAR* pReserved2,
          DWORD dwReserved3,   LPENUMSTATSG FAR* ppenumStatStg);
HRESULT DestroyElement(THIS_ const char FAR* pwcsName);
HRESULT RenameElement(THIS_ const char FAR* pwcsOldName,
          const char FAR* pwcsNewName);
HRESULT SetElementTimes(THIS_ const char FAR* IpszName,
          FILETIME const FAR *pctime;
          FILETUME const FAR *patime,   FILETIME const FAR *pmtime);
HRESULT SetClass(THIS_ REFCLSID rclsid);
HRESULT SetStateBits(THIS_ DWORD grfStateBits,  DWORD grfMask);
HRESULT Stat(THIS_ STATSG FAR *pStatStg,   DWORD grfStatFlag);
};

    Как продемонстрировано в листинге 1, память для процедур OLE выделяется, главным образом, с помощью функций интерфейса IMalloc. В IMalloc входят функции, подобные библиотечным функциям языка C alloc(), free() и realloc(). В листинге 2 демонстрируется формат интерфейса IMalloc.

    Листинг 2. Интерфейс IMalloc

DECLARE_INTERFACE_ (IMalloc, IUnknown)
{ 
 // *** методы  IUnknown***

HRESULT  QueryInterface (THIS_REFIID riid, LPVOID FAR* ppvOj);
ULONG    AddRef (THIS);
ULONG    Release (THIS);
// *** методы  IMalloc ***

void  FAR*Allooc (THIS_ ULONG cb);
void  Free (THIS_ void FAR* pv);
void  FAR*Realloc (THIS_ void FAR* pv, ULONG cb);
ULONG  Getsize (THIS_ void FAR* pv);
int    DidAlloc (THIS_ void FAR* pv);
void  HeapMinimize (THIS);
};

    На следующем шаге мы рассмотрим функции для субпамяти и потоков.




Предыдущий шаг Содержание Следующий шаг