从 propertybag 中删除不兼容的空格以解决使用 ActiveX 控件保存表单时的错误
Remove incompatible spaces from propertybag to solve error when saving form with ActiveX control
我正在寻找一种方法让 VB6 在保存表单之前或保存时编辑控件的属性包。
我们正在使用一个 activeX 控件 (AxisMediaControl),它似乎在其属性包名称中使用了空格,这在尝试保存控件所在的表单时会引发错误。
System Error &H80070057 (-2147024809)
这里描述了同样的问题:
Source of a similar problem, but i don't have *.h files ()
但是由于我们使用编译的 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 下出现。
有没有办法'edit'将属性保存到 propertybag 的方式?
我可以编辑 dll 或 ocx 以使其行为不同并拥有一个以前不兼容的 ActiveX 的最新版本吗?我试过在 dll 文件上使用 Resource Hacker 但无济于事,因为我的知识有限..
由于您提到控件在 VB 的 dotnet 版本中工作,解决方法可能是在 VB.NET 中编写包装器,然后使用 VB6 中的包装器。该包装器将提供一个标准的 "ActiveX" (COM) 接口,并在内部仅调用原始控件。您只需要在包装器中公开最少的功能,以尽量减少所涉及的工作量。
(注意 - 虽然这在技术上可行,但可能不是最佳的整体解决方案。例如,如果可以升级到更现代的控件,这可能是更好的时间投资。)
编辑 1: 包装器会增加一些额外的开销,这是肯定的。但是这种开销可能根本不重要。例如,如果您只需要进行几次调用,则运行时效果可能无关紧要。 OTOH 如果你必须在某些算法的最内层循环中调用这个东西(对 UI 控件有疑问但是......)那可能是一个更大的问题。
编辑 2: 如果您的应用程序中还没有任何 dotnet 组件,可能不值得为此问题添加该依赖项。或者,如果这真的是一个亮点的话,也许会是这样;但这可能是需要仔细考虑的额外考虑因素。
我正在寻找一种方法让 VB6 在保存表单之前或保存时编辑控件的属性包。
我们正在使用一个 activeX 控件 (AxisMediaControl),它似乎在其属性包名称中使用了空格,这在尝试保存控件所在的表单时会引发错误。
System Error &H80070057 (-2147024809)
这里描述了同样的问题: Source of a similar problem, but i don't have *.h files ()
但是由于我们使用编译的 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 下出现。
有没有办法'edit'将属性保存到 propertybag 的方式?
我可以编辑 dll 或 ocx 以使其行为不同并拥有一个以前不兼容的 ActiveX 的最新版本吗?我试过在 dll 文件上使用 Resource Hacker 但无济于事,因为我的知识有限..
由于您提到控件在 VB 的 dotnet 版本中工作,解决方法可能是在 VB.NET 中编写包装器,然后使用 VB6 中的包装器。该包装器将提供一个标准的 "ActiveX" (COM) 接口,并在内部仅调用原始控件。您只需要在包装器中公开最少的功能,以尽量减少所涉及的工作量。
(注意 - 虽然这在技术上可行,但可能不是最佳的整体解决方案。例如,如果可以升级到更现代的控件,这可能是更好的时间投资。)
编辑 1: 包装器会增加一些额外的开销,这是肯定的。但是这种开销可能根本不重要。例如,如果您只需要进行几次调用,则运行时效果可能无关紧要。 OTOH 如果你必须在某些算法的最内层循环中调用这个东西(对 UI 控件有疑问但是......)那可能是一个更大的问题。
编辑 2: 如果您的应用程序中还没有任何 dotnet 组件,可能不值得为此问题添加该依赖项。或者,如果这真的是一个亮点的话,也许会是这样;但这可能是需要仔细考虑的额外考虑因素。