码迷,mamicode.com
首页 > 其他好文 > 详细

关于MOVE 和 CopyMemory 的用法区别

时间:2018-01-05 22:34:09      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:数据解析   and   ack   bin   释放   不同   ffffff   arch   数据处理   

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

例子:

  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

关于MOVE 和 CopyMemory 的用法区别

标签:数据解析   and   ack   bin   释放   不同   ffffff   arch   数据处理   

原文地址:https://www.cnblogs.com/findumars/p/8207038.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!