В настоящее время я реализую интерфейс IOleObject
для встраивания визуализированных данных нашего программного обеспечения в другое программное обеспечение, такое как PowerPoint. Наше программное обеспечение создает графические оценки измеренных данных (диаграммы и т. Д.).OLE: общий IStorage для нескольких объектов OLE?
Цель состоит в том, чтобы конечный пользователь мог сделать двойной щелчок по встроенному объекту OLE для его редактирования в нашем программном обеспечении. Данные будут сохранены с использованием заданного интерфейса IStorage
в IPersistStorage::Save/Load
. Измеренные данные должны быть встроены, а не связаны.
Мое текущее решение работает нормально, но проблема в том, что встроенные данные будут сохранены один раз для OLE-объекта. В примере мы получили 10 МБ измеренных данных, и конечный пользователь вставляет в PowerPoint пятьдесят разных диаграмм этих измеренных данных, измеренные данные будут вставляться пятьдесят раз в файл PowerPoint (50 * 10 МБ = 500 МБ, хотя 10 МБ для файла PowerPoint будет достаточно).
Мой вопрос в том, существует ли общий интерфейс IStorage для всего контейнера (?) Или что-то похожее?
Данные интерфейсы IStorage в IPersistStorage :: Load/Save зависят только от конкретного встроенного OLE-объекта.
Было бы здорово, если бы я мог сказать хост-приложению что-то вроде «PowerPoint, мои 50 объектов OLE делятся с этим IStorage. Сохраните его только один раз в PPTX-файле».
Не могли бы вы поделиться каким-то примером или документацией о том, как его реализовать (что работает)? У меня возникла ошибка с PowerPoint, потому что она не вызывает мои методы 'IPersistStorage :: Save/Load'. – JHG
Я не уверен, что именно требуется, чтобы PowerPoint вызывал ваши методы. Мой интерфейс слушает следующие идентификаторы IID: - IOleObject = IID_IUnknown, IID_IOleObject - IDataObject = IID_IDataObject - IPersistStorage = IID_IPersist, IID_IPersistStorage - IDispatch = IID_IDispatch Может быть, вы не правильно обработки Закрыть метод (вы должны вызвать ClientSite -> SaveObject(), если флаги указывают сохранение). И вы должны обработать список AdviseSinks в своем объекте и сообщить об этом приемникам о конкретных событиях (например, OnClose). Возможно, вам не хватает одного из этих действий. –
Точно, я пропустил некоторые из этих действий. Спасибо! – JHG