在VB6中将数组作为参数传递

12
以下代码在办公室的两台机器上在标记的行处导致VB6(sp6)出现“VB.exe未处理的异常故障”错误。
''# Form1.frm
Option Explicit
Private ArrayHolder As Class2

Private Sub Command1_Click()
    Set ArrayHolder = New Class2

    Dim arr(3) As Long
    arr(0) = 1
    arr(1) = 2
    arr(2) = 3

    ArrayHolder.Add arr

End Sub

''# -----------------------------------------------------------    
''# Class1.cls
Option Explicit

Private m_myArray() As Long

Public Property Get myArray() As Long()
    myArray = m_myArray
End Property

Friend Property Let myArray(ByRef anArray() As Long)
    m_myArray = anArray
End Property

''# -----------------------------------------------------------    
''# Class2.cls
Option Explicit

Friend Function Add(newArray() As Long) As Class1
    Dim oClass As Class1
    Set oClass = New Class1

    oClass.myArray = newArray  <- This kills VB6 dead
    MsgBox "passed"

End Function

从各个网站我可以看出我正确地传递了数组,但是实际上我是否做得正确,为什么它会导致VB6崩溃?


有没有一种方法可以暗示语法高亮器正在获取哪种语言? - graham.reeds
你确定这段代码是正确的吗?Class2.cls 中的代码似乎与 Form1.frm 中的相同。这是正确的吗? - Martin Peck
这段代码没有意义。ArrayHolder.Add在哪里?为什么Class2.cls中的代码与Form1.frm中的代码相同? - GSerg
我在Class2中没有看到Add方法。 - John Saunders
Graham,我认为你应该接受Eduardo的答案。 - MarkJ
显示剩余5条评论
3个回答

9

我没有答案,这确实是一个好奇的问题,但为什么不添加一个方法并继续进行呢?

'Passed the test
Public Sub LetMyArray(anArray() As Long)
    m_myArray = anArray
End Sub


'oClass.MyArray = newArray ' <- This kills VB6 dead
oClass.LetMyArray newArray  ' <- This works

有趣的是它确实起作用。我一直在努力将其变成一个集合,但更新所有使用它的地方证明是一件痛苦的事情。 - graham.reeds
3
我认为你刚刚发现了VB运行时中的一个漏洞。但是我们将永远看不到SP7 :) - Eduardo Molteni
对于务实主义的支持加一!也许有点遗憾,但关于SP7的正确性是毋庸置疑的。运行时的扩展支持不包括服务包(我好像记得)。 - MarkJ
@Erx_VB 我承认 有争议,我应该花更多时间在“现实世界”中! :) - MarkJ
@markj 哇,我必须说我印象深刻,很棒的统计数据!显然,我是“提问”的第二高者,很幸运有像你这样的人来回答 :) - Erx_VB.NExT.Coder

9

这是一个IDE中的错误(编译后没有问题),但微软从未解决过。我使用了一个临时数组来解决此问题,代码如下:

Friend Function Add(newArray() As Long) As Class1
    Dim oClass As Class1
    Dim tempArray() As Long
    Set oClass = New Class1

    tempArray = newArray
    oClass.myArray = tempArray <- Should work now
    MsgBox "passed"

End Function

顺便提一下,当您无意中将鼠标悬停在参数或数组属性上时,Byte数组的情况会变得更糟糕(Long数组是安全的)。最好远离代码:-))


1

我不知道为什么会发生这种情况,但如果您想复制一个数组,可以在class2中使用Variant:

Private m_myArray As Variant

Public Property Get myArray() As Variant
    myArray = m_myArray
End Property

Friend Property Let myArray(anArray As Variant)
    m_myArray = anArray
End Property

修复了,但我仍然很好奇原因。

当我尝试了一个变体后,它仍然崩溃了。也许是我做错了什么?! - graham.reeds
也许你刚才按照我的话,用这段代码替换了Class2的内容。:) 当然,我是想说Class1。对我来说运行良好。 - GSerg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接