RtlMoveMemory: Unterschied zwischen den Versionen

Aus API-Wiki
Wechseln zu: Navigation, Suche
 
Zeile 3: Zeile 3:
 
Die Funktion [[RtlMoveMemory]] kopiert einen Speicherbereich. Ziel- und Quellbereich dürfen sich überlappen.
 
Die Funktion [[RtlMoveMemory]] kopiert einen Speicherbereich. Ziel- und Quellbereich dürfen sich überlappen.
  
<code vb>
+
<syntaxhighlight lang="vb">
 
Declare Sub RtlMoveMemory Lib "kernel32" ( _
 
Declare Sub RtlMoveMemory Lib "kernel32" ( _
 
                 ByRef Dest As Any, _
 
                 ByRef Dest As Any, _
 
                 ByRef Source As Any, _
 
                 ByRef Source As Any, _
 
                 ByVal cbCopy As Long)
 
                 ByVal cbCopy As Long)
</code>
+
</syntaxhighlight>
  
 
Sehr häufig wird die Alias-Deklaration '''[[CopyMemory]]''' eingesetzt:
 
Sehr häufig wird die Alias-Deklaration '''[[CopyMemory]]''' eingesetzt:
  
<code vb>
+
<syntaxhighlight lang="vb">
 
Declare Sub CopyMemory Lib "kernel32.dll" _
 
Declare Sub CopyMemory Lib "kernel32.dll" _
 
             Alias "RtlMoveMemory" ( _
 
             Alias "RtlMoveMemory" ( _
Zeile 18: Zeile 18:
 
             ByRef Source As Any, _
 
             ByRef Source As Any, _
 
             ByVal cbCopy As Long)
 
             ByVal cbCopy As Long)
</code>
+
</syntaxhighlight>
  
 
==Parameter==
 
==Parameter==
Zeile 30: Zeile 30:
 
==Beispiel==
 
==Beispiel==
  
<code vb>
+
<syntaxhighlight lang="vb">
 
Dim lWert1 As Long, lWert2 As Long
 
Dim lWert1 As Long, lWert2 As Long
 
Dim sString1 As String, sString2 As String
 
Dim sString1 As String, sString2 As String
Zeile 47: Zeile 47:
 
RtlMoveMemory ByVal StrPtr(sString2), ByVal StrPtr(sString1), LenB(sString2)
 
RtlMoveMemory ByVal StrPtr(sString2), ByVal StrPtr(sString1), LenB(sString2)
 
MsgBox sString2
 
MsgBox sString2
</code>
+
</syntaxhighlight>
  
 
==Hinweise==
 
==Hinweise==

Aktuelle Version vom 7. Oktober 2016, 22:24 Uhr

Die Funktion RtlMoveMemory kopiert einen Speicherbereich. Ziel- und Quellbereich dürfen sich überlappen.

Declare Sub RtlMoveMemory Lib "kernel32" ( _
                 ByRef Dest As Any, _
                 ByRef Source As Any, _
                 ByVal cbCopy As Long)

Sehr häufig wird die Alias-Deklaration CopyMemory eingesetzt:

Declare Sub CopyMemory Lib "kernel32.dll" _
            Alias "RtlMoveMemory" ( _
            ByRef Dest As Any, _
            ByRef Source As Any, _
            ByVal cbCopy As Long)

Parameter

Dest

Zeiger auf den Zielspeicher.

Source

Zeiger auf den Quellspeicher.

cbCopy

Anzahl der zu kopierenden Bytes.

Beispiel

Dim lWert1 As Long, lWert2 As Long
Dim sString1 As String, sString2 As String

lWert1 = 123456
'kopieren der 4 Bytes von Wert1 nach Wert2
RtlMoveMemory lWert2, lWert1, LenB(lWert2)
MsgBox lWert2

sString1 = "Test"               ' Ein String mit 4 Zeichen belegt im Speicher 8 Byte
sString2 = Space(Len(sString1)) ' hier muss Len() und nicht LenB() verwendet werden, 
                                ' damit sString2 die gleiche Länge wie sString1 erhält.

'kopieren des Strings. Um die automatische Unicode-Konvertierung zu umgehen
'muss hier Quelle und Ziel mit ByVal StrPtr() übergeben werden:
RtlMoveMemory ByVal StrPtr(sString2), ByVal StrPtr(sString1), LenB(sString2)
MsgBox sString2

Hinweise

Zugriffe auf einen nicht allozierten Speicherbereich, z.B. durch falsche Übergabe der Zieladresse, führen zu einem Zugriffsfehler und Absturz des Programms bzw. der IDE!
In der hier abgebildeten Deklaration wird ByRef As Any für die Übergabe von Quelle und Ziel verwendet. Davon abweichend werden bisweilen auch andere Deklarationen eingesetzt. Hinweis: Für die häufig verwendete Alias-Deklaration CopyMemory wird meist die Funktion RtlMoveMemory eingesetzt. Die etwas schnellere Api-Funktion RtlCopyMemory, bei der Quell- und Zielbereich nicht überlappen dürfen, wird nur selten angewandt.

Betriebssystem

  • Windows 95 / 98 / Me
  • Windows NT 4.0 / 2000 / XP
  • Windows Vista