zoukankan      html  css  js  c++  java
  • 关于MOVE 和 CopyMemory 的用法区别

    最近做了一个数据采集服务器, 根据程序的框架,使用了大量的指针结构体(内存块) 操作。

    例子:

      PArrayByte = ^TArrayByte;
      TArrayByte = packed record
        ABinding: Pointer;
        data: TBytes;
        len: integer;
        IP: string[15];
        Port: UINT;
      end;

    //数据解析函数

    function GetGuiyue(ABuffer: PArrayByte): Boolean; stdcall; external 'Guiyue.dll';

     //数据采集函数:

    function GetCommand(ABuffer: PArrayByte): Boolean;

    var

        P: PArrayByte;

    begin

      try

        new(P);

        //指针传递

        Move(ABuffer,P, Sizeof(ABuffer));  //可以将数据复制到P, ABuffer 和 P 指向同一个内存区 , ABuffer = $29580D0 ,ip= '192.168.1.132',P = $29580D0

        CopyMemory(P,ABuffer, Sizeof(ABuffer));  //可以将数据复制到P, ABuffer 和 P 指向同一个内存区 , ABuffer = $29580D0 ,ip= '192.16'######,P = $29580D0 数据复制不全,数据块长度不够

        执行出错,应该是 CopyMemory(@P,@ABuffer, Sizeof(ABuffer)); 

       //复制内存块

        Move(ABuffer,P, Sizeof(TArrayByte); //可以将数据复制到P, ABuffer 和 P 指向不同的内存区 , ABuffer = $5FFFFFF, ip= Inaccessible value, P = $29580D0

        执行出错,应该是:Move(ABuffer^,P^, Sizeof(TArrayByte);

        CopyMemory(P,ABuffer, Sizeof(TArrayByte));  //可以将数据复制到P, ABuffer 和 P 指向不同的内存区 , ABuffer = $29580D0 ,ip= '192.168.1.132',P = $24680D0  

       PArrayByte(P)^.ip := '113.140.88.*';  //数据处理

       GetGuiyue(P);  //数据解析

       所以使用指针传递 复制数据 要在数据处理函数进行指针释放 Dispose(P);

        finally

           Dispose(P);  //使用内存块复制数据,释放数据源指针  $24680D0  

        end; 

    end;

    //数据解析

    function GetGuiyue(ABuffer: PArrayByte): Boolean; stdcall;

    var

        myBuffer: TBytes;

    begin

       try

          CopyMemory(@myBuffer[0],@ABuffer^.data[0], ABuffer^.len)        

           .............//数据处理

       except

      end;

    end;        

    http://www.cnblogs.com/wxy8/archive/2011/06/22/2086703.html

  • 相关阅读:
    引擎设计跟踪(九.10) Max插件更新,地形问题备忘
    引擎设计跟踪(九.9) 文件包系统(Game Package System)
    [原] Android上使用native IO
    [原] GLES在iOS和Android上的不同
    [原] perforce 获取本地最近更新的Changelist
    [转]GLES 3.0 新特性
    [原]android不支持命名的semaphore
    [原]android 链接错误
    引擎设计跟踪(九.8) Gizmo helper实现与多国语言
    [原]游戏引擎与游戏逻辑
  • 原文地址:https://www.cnblogs.com/findumars/p/8207038.html
Copyright © 2011-2022 走看看