2016-11-10 65 views
1

我目前正在實施一個IOleObject界面,將我們軟件的可視化數據嵌入到其他軟件,如PowerPoint中。我們的軟件創建測量數據的圖形評估(圖表等)。OLE:爲多個OLE對象共享IStorage?

目標是,最終用戶可以雙擊嵌入的OLE對象以在我們的軟件中對其進行編輯。數據將使用IPersistStorage::Save/Load中給定的IStorage接口進行存儲。測量數據必須嵌入,而不是鏈接。

我目前的解決方案工作正常,但問題是,嵌入數據將被保存一次每個OLE對象。例如,我們獲得了10 MB的測量數據,最終用戶將五十個不同的測量數據圖嵌入到PowerPoint中,測量數據將在PowerPoint文件中嵌入五十次(50 * 10 MB = 500 MB,儘管10 MB每個PowerPoint文件就足夠了)。

我的問題是如果存在任何共享IStorage接口的整個容器(?)或類似的東西?

IPersistStorage :: Load/Save中給定的IStorage接口僅取決於特定的嵌入式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 也許你沒有正確處理Close方法(你必須調用ClientSite - > SaveObject()如果標誌指定保存)。並且您必須處理對象中的AdviseSinks列表並通知這些接收器有關特定事件(即OnClose)。 也許您錯過了其中一項操作。 –

+0

的確,我錯過了其中的一些行動。謝謝! – JHG

回答

3

不,這就是OLE嵌入應該工作的方式。每個對象在容器中都有自己的存儲空間。如果它是具有相同數據的同一對象,爲什麼需要嵌入50次?如果它是相同的對象,並且您希望它位於演示文稿中的不同頁面上,爲什麼不嵌入第一個實例並使所有其他實例鏈接?這將節省存儲空間。當然,如果你刪除第一個嵌入實例,所有的鏈接將轉向....

+0

在每個嵌入對象上顯示不同的圖表。對象的測量數據是相同的,但圖表的設置是不同的。 我已經想過這樣的解決方案,但我應該如何將其他OLE對象鏈接到第一個(嵌入的)OLE對象? –

+1

如果你要有不同的演示文稿,那麼你可能需要不同的嵌入對象。我可能會做類似於2種類型的對象。其一,是你的數據存儲當然是嵌入的對象。然後你會有一個不同類型的對象,就是你的演示文稿。它可能會小得多,但它需要用數據存儲對象的名字來初始化,以便它可以檢索數據進行演示。 –

+0

好吧,我會嘗試作爲一個額外的選項。謝謝。 –