VB6和Delphi - TStringList是VB免费的

时间:2012-03-26 18:09:51

标签: delphi vb6 ocx tstringlist

我有以下情况: 使用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

这是有效的,做所有必要的过程没有任何错误,但第一种情况,错误仍然存​​在。

有没有人遇到过类似的问题?

谢谢你们,任何可以帮助我的人都会感激不尽

1 个答案:

答案 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 

告诉我们是否有变化......