VB6 и Delphi - TStringList бесплатен для VB - PullRequest
0 голосов
/ 26 марта 2012

У меня следующая ситуация: Объект создается в VB6 с использованием OCX, созданного в Delphi. когда я

...
Dim x As New spdComponent
Set x = spdComponent.ConverterType (XML)
count = x.item.count
TXT = ""
...

Счетчик правильно получает значение всех элементов 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 Ответ

1 голос
/ 27 марта 2012

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 

И скажите нам, если что-то изменилось ...

...