关于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
关于MOVE 和 CopyMemory 的用法区别的更多相关文章
- Delphi中那些容易混淆的基础(@、^、Addr、Pointer,Move、CopyMemory,GetMem和FreeMem、GetMemory和FreeMemory、New和Dispose、StrAlloc和StrDispose、AllocMem)
@.^.Addr.Pointer Delphi(Pascal)中有几个特殊的符号,如@.^等,弄清楚这些符号的运行,首先要明白Delphi指针的一些基础知识:指针,是一个无符号整数(unsigned ...
- order_by_、group_by_、having的用法区别
写于 2012-11-20 22:14 doc文档上. Having 这个是用在聚合函数的用法.当我们在用聚合函数的时候,一般都要用到GROUP BY 先进行分组,然后再进行聚合函数的运算.运算完后 ...
- html中的alt和title用法区别
html中的alt和title用法区别 首先明确一下概念,alt是html标签的属性,而title既是html标签,又是html属性.title标签这个不用多说,网页的标题就是写在<title& ...
- 转 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 ...
- OC .(点)与->(箭头)用法区别
这两天同学总是问OC里.和->的用法区别,当时回答的不是很好,周末查了一下,大概清楚了,在这里记录一笔. 先看这个例程 #import <Foundation/Foundation.h&g ...
- php中strstr、strrchr、substr、stristr四个函数用法区别
php中strstr.strrchr.substr.stristr四个函数用法区别: php中strstr strrchr substr stristr这四个字符串操作函数特别让人容易混淆,常用的是s ...
- mysql SELECT FOUND_ROWS()与COUNT(*)用法区别
在mysql中 FOUND_ROWS()与COUNT(*)都可以统计记录,如果都一样为什么会有两个这样的函数呢,下面我来介绍SELECT FOUND_ROWS()与COUNT(*)用法区别 SEL ...
- php中print_r、var_dump和var_export几个函数的用法区别
php中print_r.var_dump和var_export几个函数的用法区别
- Oracle中 (+)与left join 的用法区别
Oracle中 (+)与left join 的用法区别 原创 2017年01月11日 13:33:42 6648 select * from a,b where a.id=b.id(+); (+)写在 ...
随机推荐
- git各种命令 & git merge和git rebase的区别
git merge 和 rebase的区别: http://blog.csdn.net/jollyjumper/article/details/24743751 对于两个分支而言,rebase和mer ...
- 更改jdk所用内存空间
在做项目是有时候会遇到内存jvm内存不够用的情况,在myeclipse是这样设置的. -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=128m
- CSDN日报20170406 ——《代码非常烂,所以离职。》
[程序人生]代码非常烂.所以离职? 作者:stormzhang 我在面试的时候一般会问这么一个问题:你为什么离职? 当中有不少同学会提到这么一个原因.现在的项目代码太烂了,前人留下了非常多坑,我实在忍 ...
- Dll的链接使用细节
关于Dll Dll.Exe 都是PE格式的二进制文件. Dll相当于Linux操作系统下的so文件 1 基地址(Base Address)和相对地址(RelativeVirtual Address) ...
- FastSocket学习笔记~RPC的思想,面向对象的灵活
首先非常感谢这位来自新浪的老兄,它开发的这个FastSocket非常不错,先不说性能如何,单说它的使用方式和理念上就很让人赞口,从宏观上看,它更像是一种远程过程的调用RPC,即服务器公开一些命令,供客 ...
- MHA 一主两从搭建-keepalived-手动切换
环境介绍:主机名 IP MHA角色 MySQL角色node1 192.168.56.26 Node MySQL Master node2 192.168.56.27 Node MySQL Master ...
- IL命令初学者要知道的事
在一个中间语言程序中,如果某一行以“.”开始,代表这是一个传输给汇编工具的指令:而不是以“.”开始的行是中间语言的代码.上图中.method是方法定义指令,定义了Main方法,参数在“()”中,IL代 ...
- 修复STS4 server中没有Tomcat的问题(必看,官方推荐,包教包会,国内首发)
版权声明:原创.欢迎转载,转载请注明来源,谢谢. https://blog.csdn.net/qq_41910280/article/details/83279129 修复STS4 server中没有 ...
- linux(debian)系统django配远程连接sqlserver数据库
费了将近一天时间.最终解决,记下来留给须要的人 须要安装的: python-odbc : https://github.com/mkleehammer/pyodbc下载后install 安装pytho ...
- 【35.02%】【codeforces 734A】Vladik and flights
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...