我有以下情况: 使用Delphi中的OCX在VB6中实例化一个对象。 当我
...
Dim x As New spdComponent
Set x = spdComponent.ConverterType (XML)
count = x.item.count
TXT = ""
...
Count正确接收TStringList OCX的所有项的值,但很快下面的行,TXT变空,'x.item.cout'的值丢失。 当我在Delphi中调试时,实际上发生的是从内存中释放的TStringList,但这种情况没有任何意义(似乎Delphi和VB之间存在利益冲突)。 在这里和谷歌搜索,我看到很多评论不使用TStringList而不是PChar,这将是一种更合适的工作方式,但问题仍然是使用C#2005和相同的OCX,问题不会发生。 (和其他语言一样,到目前为止仅在VB 6中)。
嗯,我有证据表明VB杀死了对象(TStrinList),因为对他而言,该对象不再是必需的,但确实如此。 发生的一件奇怪的事情是,如果我
count = spdComponent.ConverterType(XML).item.count
这是有效的,做所有必要的过程没有任何错误,但第一种情况,错误仍然存在。
有没有人遇到过类似的问题?
谢谢你们,任何可以帮助我的人都会感激不尽
答案 0 :(得分:1)
AFAIR,VB Classic使用引用计数语义来管理内存。这意味着,在代码中的某个位置,对spdComponent.ConverterType(XML)
创建的实例的所有引用都将被清除(指向Nothing
)或超出范围。
编辑:在你的代码中,当你Dim x As New spdComponent
时,你正在销毁Set x = spdComponent.ConverterType (XML)
创建的实例。也许你可以测试一下:
' Removed the instantiation on the declaration
Dim x As spdComponent
Set x = spdComponent.ConverterType (XML)
count = x.item.count
告诉我们是否有变化......