Фон
Был старый элемент управления ActiveX, созданный VB. Я добавил этот элемент управления ActiveX в свою книгу Excel и установил некоторые свойства. Эти свойства были сохранены при сохранении книги. В частности, они были сохранены в функции UserControl_WriteProperties, используя PropertyBag в коде VB. Таким образом, эти свойства сохранились в книге до сих пор.
Моя задача
Я должен создать новый элемент управления ActiveX, используя C ++, чтобы быть обратно совместимым со старым. Мне нужно, чтобы ВСЕ данные сохранялись в элементе управления ActiveX, который находится в моей старой книге Excel. Итак, я внедряю IPersistPropertyBag в свой элемент управления ActiveX.
Я ожидаю, что когда я открою свою старую книгу Excel, вся информация должна быть правильно получена через PropertyBag.
проблема
Я обнаружил, что информация сохраняется в моей книге Excel в формате Stream. Я могу реализовать IPersistStreamInit для моего нового элемента управления ActiveX, но я не понимаю, какой формат потока сохранился в моей книге Excel. Таким образом, я не могу восстановить информацию, сохраненную в моей книге Excel.
Интересно, почему информация была сохранена в формате Stream, хотя она была сохранена с помощью Propertybag в коде VB.
Вопрос
Есть ли способ получить всю информацию в элементе управления ActiveX в этом сценарии?
Я нашел это в течение двух дней, но я не могу найти способ.
Сумка свойств сохраняется в потоке, вот и все.
Я ожидаю, что ваш элемент управления C ++ реализует IPersistStream, поэтому Excel пытается использовать это. Я предлагаю вам сначала попытаться извлечь IPersistStream, IPersistStreamInit и IPersistStorage из элемента управления C ++, оставив только IPersistPropertyBag.
Я сделал эту задачу, создав VB6 COM dll для решения этой задачи.
Option Explicit
Dim objMyPropertyBag As PropertyBag
Public Sub Contents(a_content As Variant)
objMyPropertyBag.Contents = a_content
End Sub
Public Function Read(key As String) As String
On Error GoTo Error_Handler
Read = objMyPropertyBag.ReadProperty(key)
Error_Handler:
MsgBox Err.Source & Err.Number
End Function
Private Sub Class_Initialize()
Set objMyPropertyBag = New PropertyBag
End Sub
Когда я открываю мою старую книгу Excel, которая содержит старый объект ActiveX. Я делаю следующие шаги:
Теперь я могу прочитать любой ключ в PropertyBag через contentReader-> Read (ключ [in], значение [out]).