VB和C ++ ActiveX控件以不同的方式保存其信息,如何实现C ++ ActiveX控件replaceVB ActiveX?

背景

有一个由VB创build的旧的ActiveX控件。 我将这个ActiveX控件添加到我的Excel工作簿并设置了一些属性。 当这本书被保存时,这些属性被保存了。 具体来说,它们保存在使用VB代码中的PropertyBag的UserControl_WriteProperties函数中。 所以这些属性一直存在于工作簿中。

我的任务

我必须使用C ++创build一个新的ActiveX控件,以便与旧版本兼容。 我需要所有信息保存在我的旧Excel工作簿中的ActiveX控件中。 所以,我实现了IPersistPropertyBag到我的ActiveX控件。

我的期望是,当我打开我的旧Excel工作簿时,必须通过PropertyBag正确检索所有信息。

问题

我发现我的Excel工作簿中保存的信息是stream格式。 我可以实现IPersistStreamInit到我的新的ActiveX控件,但我不明白在我的Excel工作簿持续stream的格式。 所以,我无法检索我的Excel工作簿中保存的信息。

我不知道为什么这些信息是以Stream格式保存的,尽pipe它们是通过VB代码中的Propertybag保存的。

在这种情况下有没有办法让所有的信息在ActiveX控件中保留? 我已经find了两天,但我找不到方法。

物业包被保存成小溪,就这样。

我期望你的C ++控件实现IPersistStream,所以Excel试图使用它。 我build议你先尝试从C ++控件中取出IPersistStream,IPersistStreamInit和IPersistStorage,只留下IPersistPropertyBag。

我已经通过创build一个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 

当我打开包含旧的ActiveX对象的旧Excel工作簿时。 我做了以下步骤:

  1. 它会来到IPersistStreamInit :: Load函数给我一个IStream。
  2. 我读了这个stream,并parsing为VT_UI1(等于BYTE数组)的SAFEARRAY VARIANT,名为“content”。
  3. 我创build了一个名为“contentReader”的VB6 COM DLL实例。
  4. 我打电话给contentReader-> Contents(content)(把我创build的SAFEARRAY传给它)。

现在我可以通过contentReader-> Read([in]键,[out]值)读取PropertyBag中的任何键。

Interesting Posts