Caveats of the CopyMemory API function

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, bytesEnd If


    Share the Post: