VB CopyMemory() 函数功能详解

函数声明:
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Any, ByVal Source As Any, ByVal Length As Long)

功能描述:
    将一块内存的数据从一个位置复制到另一个位置。

    它是定义在 Kernel32.dll 中的 RtlMoveMemory 这个 API,32位C函数库中的 memcpy 就是这个API的包装。

    如 MSDN 文档中所言,它的功能是将从 Source 指针所指处开始的长度为 Length 的内存拷贝到 Destination 所指的内存处。

    它不会管我们的程序有没有读写该内存所应有的权限,一但它想读写被系统所保护的内存时,我们就会得到著名的 Access Violation Fault (内存越权访问错误),甚至会引起更著名的 general protection (GP) fault (通用保护错误)。

    所以,在进行本系列文章里的实验时,请注意随时保存你的程序文件,在VB集成环境中将"工具"->"选项"中的"环境"选项卡里的"启动程序时"设为"保存改变",并记住在"立即"窗口中执行危险代码之前一定要保存我们的工作成果。

函数原型:
    VOID CopyMemory(
      PVOID Destination,
      CONST VOID *Source,
      DWORD Length
  );

参数详解:
    Destination    整数型,要复制内存块的目的地址。
    Source         整数型,要复制内存块的源地址。
    Length         整数型,指定要复制内存块的大小,单位为字节。

返回值:
    该函数为VOID型,没有返回值。CopyMemory 调用的方式为过程调用,不能有返回值。

注意事项:
    CopyMemory 本身传递 Source 是按地址传递,但此处要按值传递指针(例如:ByVal Int(&HA490A0))。

    用来欺骗 VB,VB 仍然认为传递的是内存地址(VB会把传递的数值当做内存地址)。

使用环境:
    Windows NT:要求 3.1 或更高版本。
    Windows:要求 windows 95 或更高版本。
    Windows CE:不支持。
    VC++头文件:winbase.h。

使用方法:
    读取内存1:
      CopyMemory Tmp1, Tmp2, 4

    读取内存2:
      Dim N1 As Long
      CopyMemory N1, ByVal Int(&HA490A0), 2

    写入内存:
      Dim N1 As Long
      CopyMemory ByVal Int(&HA490A0), N1, 2