2016-11-10 2 views
1

В настоящее время я реализую интерфейс 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-файле».

+0

Не могли бы вы поделиться каким-то примером или документацией о том, как его реализовать (что работает)? У меня возникла ошибка с PowerPoint, потому что она не вызывает мои методы 'IPersistStorage :: Save/Load'. – JHG

+1

Я не уверен, что именно требуется, чтобы PowerPoint вызывал ваши методы. Мой интерфейс слушает следующие идентификаторы IID: - IOleObject = IID_IUnknown, IID_IOleObject - IDataObject = IID_IDataObject - IPersistStorage = IID_IPersist, IID_IPersistStorage - IDispatch = IID_IDispatch Может быть, вы не правильно обработки Закрыть метод (вы должны вызвать ClientSite -> SaveObject(), если флаги указывают сохранение). И вы должны обработать список AdviseSinks в своем объекте и сообщить об этом приемникам о конкретных событиях (например, OnClose). Возможно, вам не хватает одного из этих действий. –

+0

Точно, я пропустил некоторые из этих действий. Спасибо! – JHG

ответ

3

Нет, это то, как должно работать OLE-встраивание. Каждый объект получает свое хранилище в контейнере. Если это тот же объект с теми же данными, зачем его нужно вставлять 50 раз? Если это один и тот же объект, и вы хотите, чтобы он находился на разных страницах презентации, почему бы не вставить первый экземпляр и не сделать все остальные экземпляры ссылок? Это спасло бы хранение. Конечно, если вы удалите первый внедренный экземпляр, все ссылки перейдут на ....

+0

На каждом внедренном объекте показана другая диаграмма. Измеренные данные для объекта одинаковы, но настройки для диаграммы различны. Я уже думал о таком решении, но как мне связать другие объекты OLE с первым (встроенным) OLE-объектом? –

+1

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

+0

Хорошо, я попробую это как дополнительный вариант. Благодарю. –

Смежные вопросы