Probleme mit CopyMemory API (VB/Programm-Absturz)

  • VB6

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Gast.

    Probleme mit CopyMemory API (VB/Programm-Absturz)

    Ich benutze in meinem Programm die CopyMemory API, welche ich dort auch dringend benötige.

    Deklaration:
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

    Nun benutze ich diese CopyMemory API und mein Programm stürzt immer ab (bzw. VB, wenn ich das Programm in der IDE laufen lasse). Es ist ein richtiger Absturz, also VB wird komplett beendet ohne dass ich noch was machen kann.

    Hier mein Code:

    [...]

    Dim PlayerFrags() As Long
    Dim b(3) As Byte

    [...]

    ' Spielerpunkte (Frags) einlesen
    b(0) = Asc(Mid(ReceivedData, AktPos, 1))
    b(1) = Asc(Mid(ReceivedData, AktPos + 1, 1))
    b(2) = Asc(Mid(ReceivedData, AktPos + 2, 1))
    b(3) = Asc(Mid(ReceivedData, AktPos + 3, 1))
    CopyMemory ByVal VarPtr(PlayerFrags(i)), ByVal b(0), 4

    [...]

    Wer kann mir damit helfen? Bisher konnte mir mit der CopyMemory API keiner weiterhelfen, scheint was ganz kompliziertes zu sein. Danke schonmal!
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Hallo Marcus,
    wenn Dein Code wirklich dem entspricht, was Du angegeben hast, dann sind hier einige kleinere Fehler enthalten.
    Zunächst zur Deklaration der Variablen:

    Public Declare Sub CopyMemory Lib "kernel32" alias "RtlMoveMemory" (ByVal Destination as Any, ByVal Source As Any, ByVal Length as Long)

    Dim PlayerFrags(0 to 3) as long 'explicit von 0 bis 3 angeben!
    Dim b(0 to 3) as byte
    ...
    call CopyMemory(playerfrags(i), b(0), 4)

    ----------------------

    Hier ein Beispiel das funktioniert:
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

    Public Sub tcm()
    Dim a(0 To 3) As Long
    Dim b(0 To 3) As Byte
    Dim c As Long
    For c = 0 To 100
    a(0) = c * 100
    Call CopyMemory(b(0), a(0), 4)
    Debug.Print c, b(0), b(1), b(2), b(3)
    Next c
    End Sub

    Gruß
    Andy
    Wie ist denn die Deklaration nun richtig? Oben in deinem Post schreibst du was anderes als unten, aber beides ist zu meiner Deklaration leicht unterschiedlich.

    Also entweder
    Public Declare Sub CopyMemory Lib "kernel32" alias "RtlMoveMemory" (ByVal Destination as Any, ByVal Source As Any, ByVal Length as Long)

    oder
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)


    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Vielleicht noch ein kurzer Hinweis bzgl. der Funktion VarPtr.
    Normalerweise übergibt VB bis 6.0 - wenn nichts anderes angegeben wurde - alle Parameter als Referenz, d.h. die Adresse der Variablen.
    VarPtr ermittelt die Adresse.
    Wird VarPtr als Übergabewert an einen mit ByRef deklarierten Übergabeparameter verwendet, dann wird eine Adressenreferenz auf eine lokal angelegte Variable (hier Typ Long) übergeben und nicht der Inhalt der Variable.
    Abhilfe schafft hier die von mir beschriebene Lösung oder eine Änderung der Deklaration, was ich aber für kritisch (vor allem hinsichtlich der aktuellen Version 7.0) halte.