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

例子:

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 的用法区别的更多相关文章

  1. Delphi中那些容易混淆的基础(@、^、Addr、Pointer,Move、CopyMemory,GetMem和FreeMem、GetMemory和FreeMemory、New和Dispose、StrAlloc和StrDispose、AllocMem)

    @.^.Addr.Pointer Delphi(Pascal)中有几个特殊的符号,如@.^等,弄清楚这些符号的运行,首先要明白Delphi指针的一些基础知识:指针,是一个无符号整数(unsigned ...

  2. order_by_、group_by_、having的用法区别

    写于 2012-11-20 22:14  doc文档上. Having 这个是用在聚合函数的用法.当我们在用聚合函数的时候,一般都要用到GROUP BY 先进行分组,然后再进行聚合函数的运算.运算完后 ...

  3. html中的alt和title用法区别

    html中的alt和title用法区别 首先明确一下概念,alt是html标签的属性,而title既是html标签,又是html属性.title标签这个不用多说,网页的标题就是写在<title& ...

  4. 转 SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题

    SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题 SQL Union和SQL Union All用法 SQL UNION 操作符 UN ...

  5. OC .(点)与->(箭头)用法区别

    这两天同学总是问OC里.和->的用法区别,当时回答的不是很好,周末查了一下,大概清楚了,在这里记录一笔. 先看这个例程 #import <Foundation/Foundation.h&g ...

  6. php中strstr、strrchr、substr、stristr四个函数用法区别

    php中strstr.strrchr.substr.stristr四个函数用法区别: php中strstr strrchr substr stristr这四个字符串操作函数特别让人容易混淆,常用的是s ...

  7. mysql SELECT FOUND_ROWS()与COUNT(*)用法区别

    在mysql中 FOUND_ROWS()与COUNT(*)都可以统计记录,如果都一样为什么会有两个这样的函数呢,下面我来介绍SELECT FOUND_ROWS()与COUNT(*)用法区别   SEL ...

  8. php中print_r、var_dump和var_export几个函数的用法区别

    php中print_r.var_dump和var_export几个函数的用法区别

  9. Oracle中 (+)与left join 的用法区别

    Oracle中 (+)与left join 的用法区别 原创 2017年01月11日 13:33:42 6648 select * from a,b where a.id=b.id(+); (+)写在 ...

随机推荐

  1. Mybatis的使用中的一些不太注意的技巧

    以下就总结一下Mybatis的使用中的一些不太注意的技巧,算是Mybatis的总结笔 1.插入时主键返回 我们向数据库插入一条记录是,使用Mybatis的<insert>是无法返回插入的主 ...

  2. Spring Boot 动态数据源(Spring 注解数据源)

    本文实现案例场景:某系统除了需要从自己的主要数据库上读取和管理数据外,还有一部分业务涉及到其他多个数据库,要求可以在任何方法上可以灵活指定具体要操作的数据库. 为了在开发中以最简单的方法使用,本文基于 ...

  3. [React] Style the body element with styled-components and "injectGlobal"

    In this lesson, we see how we can apply styles globally with the "injectGlobal" helper met ...

  4. stm32的串口中断

    下面有很多问题没有验证: 在设置USART_CR1中的TE位时,会发送一个空闲帧作为第一次数据发送, 目前我所了解的串口中断发送,有两种方式: 一个是:TC 一个是:TXE 这是判断两个标志位, 第一 ...

  5. UVA 11889 - Benefit 可直接枚举

    看题传送门 题目大意: 输入两个整数A和C,求最小的整数B,使得lcm(A,B)=C.如果无解,输出NO SOLUTION 思路: A*B=C*gcd(A,B) 所以 B / gcd(A,B) = C ...

  6. 大数据(十四) - Storm

    storm是一个分布式实时计算引擎 storm/Jstorm的安装.配置.启动差点儿一模一样 storm是twitter开源的 storm的特点 storm支持热部署,即时上限或下线app 能够在st ...

  7. angular之Http服务

    原文 https://www.jianshu.com/p/53e4a4bfad7d 大纲 1.什么是angular服务 2.服务的类别 3.认识angular的Http请求 4.简单实例 5.angu ...

  8. 【solr专题之四】在Tomcat 中部署Solr4.x 分类: H_HISTORY 2014-07-17 16:08 1286人阅读 评论(0) 收藏

    1.安装Tomcat (1)下载并解压至/opt/tomcat中 # cd /opt/jediael # tar -zxvf apache-tomcat-7.0.54.tar.gz # mv apac ...

  9. php面试题8

    php面试题8 一.总结 二.php面试题8 1.表单数据提交方式 POST 和 GET 的区别,URL 地址传递的数据最大长度是多少?$_GET 传参是请求 HTTP 协议通过 url 参数传递和接 ...

  10. 11G、12C安装结束需要做的一些操作

    修改spfile参数:修改前,先备份 create pfile from spfile; alter system set memory_target=0 scope=spfile;alter sys ...