2009-05-12 21 views
9

次のコードでは、マークされた行のオフィスにある2台のコンピュータで、VB6(sp6)を「VB.exeの未処理例外エラー」で強制終了します。私は私が正しく配列を渡していますが、私は実際にそれを正しくやって、そしてなぜそれがVB6はとても恐ろしく死ぬことを引き起こしている様々なウェブサイト上で伝えることができるものから、VB6でパラメータとして配列を渡す

''# 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 

+0

構文がハイライターにどのような言語になっているかをヒントしていますか? –

+0

このコードは正しいですか? Class2.cls内のコードはForm1.frmと同じに見えます。これは正しいです? –

+0

このコードは意味がありません。 ArrayHolder.Addはどこですか?なぜClass2.clsのコードがForm1.frmのコードと同じですか? – GSerg

答えて

8

私は答えがなく、確かに興味深い質問ですが、なぜメソッドを追加して移動しないのですか?

'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 
+0

奇妙なことにうまくいきます。 私はそれをコレクションにしていましたが、使用されているすべての場所を更新することは苦痛であることが証明されていました。 –

+3

私はVBランタイムでバグを発見したと思います。しかし、私たちは決してSP7を見ません:) –

+0

+1のプラグマティズム!そして、おそらく、悲しいことに、SP7について正しいことがあるとします。ランタイムの拡張サポートにはサービスパックが含まれていません(私は覚えているようです) – MarkJ

1

私はこれがなぜ起こるかわかりませんが、あなたはとにかく配列のコピーが必要な場合は、クラス2にバリアントを使用します。

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 

修正して、それでも、私は好奇心です理由。

+0

私は変種を試したとき、それでもクラッシュしました。多分私は何か間違ったことをしましたか? –

+0

たぶんあなたは私が言ったことをして、Class2の内容をこのコードに置き換えました。 :)もちろん、私はClass1と言っていました。私のためにうまく動作します。 – GSerg

+0

まだマシンにクラッシュしています –

8

これは、MSが修正されていないIDEのコンパイル済みです(コンパイル済みです)。私はこのような一時配列と回避策を使用しています:FYI

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 

を誤っPARAMまたは配列プロパティの上にマウスを置くと、それは(ロング配列が安全である)バイト配列に悪化します。マウスをコードから離しておく方がいいです:-))

関連する問題