excel — элементы управления ActiveX VB и C ++ сохраняют свою информацию по-разному, как я могу реализовать элемент управления ActiveX C ++ для замены ActiveX VB?

Фон

Был старый элемент управления 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 в этом сценарии?
Я нашел это в течение двух дней, но я не могу найти способ.

2

Решение

Сумка свойств сохраняется в потоке, вот и все.

Я ожидаю, что ваш элемент управления C ++ реализует IPersistStream, поэтому Excel пытается использовать это. Я предлагаю вам сначала попытаться извлечь IPersistStream, IPersistStreamInit и IPersistStorage из элемента управления C ++, оставив только IPersistPropertyBag.

1

Другие решения

Я сделал эту задачу, создав 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. Я делаю следующие шаги:

  1. Это придет к функции IPersistStreamInit :: Load, которая даст мне IStream.
  2. Я читаю этот поток и анализирую VARIANT SAFEARRAY VT_UI1 (равный массиву BYTE), который называется «content».
  3. Я создаю экземпляр VB6 COM dll, называемый «contentReader».
  4. Я называю contentReader-> Contents (content) (передайте созданный мной SAFEARRAY).

Теперь я могу прочитать любой ключ в PropertyBag через contentReader-> Read (ключ [in], значение [out]).

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector