Vb6 从propertybag中删除不兼容的空格,以解决使用ActiveX控件保存表单时出现的错误

Vb6 从propertybag中删除不兼容的空格,以解决使用ActiveX控件保存表单时出现的错误,vb6,activex,incompatibility,propertybag,Vb6,Activex,Incompatibility,Propertybag,我正在寻找一种方法,让VB6在表单保存之前或保存时编辑控件的propertybag 我们使用的activeX控件(AxisMediaControl)似乎在其propertybag名称中使用空格,这在尝试保存控件所在的表单时会引发错误 系统错误&H80070057(-2147024809) 此处描述了相同的问题: 但是,由于我们使用已编译的ActiveX,我无法编辑它处理写入属性的方式,并且我们无法访问ActiveX的源 我已经设法创建了一个在运行时将控件作为对象数组加载的变通方法,但这样我就不

我正在寻找一种方法,让VB6在表单保存之前或保存时编辑控件的propertybag

我们使用的activeX控件(AxisMediaControl)似乎在其propertybag名称中使用空格,这在尝试保存控件所在的表单时会引发错误

系统错误&H80070057(-2147024809)

此处描述了相同的问题:

但是,由于我们使用已编译的ActiveX,我无法编辑它处理写入属性的方式,并且我们无法访问ActiveX的源

我已经设法创建了一个在运行时将控件作为对象数组加载的变通方法,但这样我就不会让它们被索引以按索引捕获事件

Dim Axis(1) As AxisMediaControl
For i% = 0 To 1
   Set Axis(i%) = Controls.Add("AxisMediaControl.AxisMediaControl.1", "AMC" & i%)
   Axis(i%).Tag = "CAM" + Format$(i%)
Next i%
'   Play Video

    With Axis(0)
        .Top = 600
        .Left = 240
        .Width = 9135
        .Height = 5535
        .Visible = True

        .StretchToFit = True
        .MaintainAspectRatio = True
        .EnableContextMenu = True

        .MediaFile = VideoFile$
        .play
    End With


'   Play Stream

    With Axis(1)
        .Top = 6840
        .Left = 240
        .Width = 9135
        .Height = 5535
        .Visible = True

        .StretchToFit = True
        .MaintainAspectRatio = True
        .EnableContextMenu = True

        .MediaFile = VideoStream$
        .play
    End With
ActiveX在较新版本的Visual Basic(如express 2005或vb.net)上运行良好,仅在vb6下出现

是否有方法“编辑”属性保存到propertybag的方式


我是否可以编辑dll或ocx,使其行为不同,并具有以前不兼容的ActiveX的最新工作版本?我曾尝试在dll文件上使用Resource Hacker,但没有效果,因为我的知识有限。

由于您提到控件在VB的dotnet版本中工作,解决方法是在VB.NET中编写包装,然后从VB6中使用该包装。这个包装器将提供一个标准的“ActiveX”(COM)接口,并在内部调用原始控件。您只需要在包装器中公开最少的功能,就可以最大限度地减少所涉及的工作量

(注意-虽然这在技术上可能有效,但可能不是最佳的总体解决方案。例如,如果可以升级到更现代化的控制系统,这可能是更好的时间投资。)


编辑1:包装器会带来一些额外的开销,这是肯定的。但这种开销可能一点也不重要。例如,如果您只需要进行几个调用,那么运行时效果可能与此无关。如果你必须在某个算法的最里面的循环中调用这个东西(对于UI控件来说是可疑的,但是…),那可能是一个更大的问题


编辑2:如果你的应用程序中还没有任何dotnet组件,那么就不值得为这个问题添加依赖项。或者,如果这真的是一场闹剧,也许会是这样;但这可能是一个需要仔细考虑的额外因素。

这可能是一个问题。如果没有控件的源代码,您如何知道该控件正在保存到其属性包中的内容?(或者我只是不明白张贴的问题)我想你完全明白,我不知道到底是什么被拯救了。这就是为什么我最终需要一种在保存属性之前检索它们的方法。。。随后,在检索这些之后,想出一种方法,在罪魁祸首控件仍在表单上时保存表单(因为我需要索引并能够使用
load
命令。类似于
replace()
我可以在这些属性上执行..有什么意义吗?因为我在这个问题上一直处于死胡同,所以这可能是解决问题的方法。现在的解决方法就是保持事件的真实性,并通过轮询运行时加载的每个控件的status属性来创建我们自己的“事件”。然而,这需要让我们让应用程序加载大量的控件,而这些控件在将来不需要更大。多亏了这个选项,我们现在需要了解包装器。这样的包装器会减慢速度还是可以忽略?