Browse DevX
Sign up for e-mail newsletters from DevX

Tip of the Day
Language: VB4/32,VB5,VB6
Expertise: Advanced
Jun 12, 1999



Building the Right Environment to Support AI, Machine Learning and Deep Learning

Caveats of the CopyMemory API function

Here's the correct declaration of the CopyMemory API function, which is so useful whenever you want to move a block of bytes between two memory locations:

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, _
    source As Any, ByVal bytes As Long)
You should be aware of a few caveats of this statement:

  • When the source or the destination is a Visual Basic variable, it should be passed by reference, for example:
        ' copy an Integer into the low word of a Long variable
        CopyMemory lngValue, intValue, 2
  • When the source or the destination is a memory locationyou should pass a 32-bit address by value, for example:
        ' Copy the contents of a Long variable to the memory location
        ' pointed to by the "address" variable
        Dim address As Long
        CopyMemory ByVal address, lngValue, 4
  • When the source or the destination is an array of numbers (or of UDTs that contains only numeric and fixed-length strings), you must pass the first element of the array by reference:
        ' Copy the first 1000 elements of array a() to b()
        ' both arrays must be of the same type, and can't be objects 
        ' nor variable-length strings
        CopyMemory b(0), a(0), 1000 * Len(a(0))
  • Passing zero as the last arguments crashes the application, therefore when the number of bytes to be transferred is dynamically evalutated at runtime, you should always check that it isn't a null value, as in:
    If bytes > 0 Then
        CopyMemory source, dest, bytes
    End If
    Francesco Balena
    Comment and Contribute






    (Maximum characters: 1200). You have 1200 characters left.



    Thanks for your registration, follow us on our social networks to keep up-to-date