delphi copymemory
场景:delphi copymemory函数拷贝字符串到构造体中
delphi copymemory函数拷贝字符串到结构体中
代码的目的,是将接收过来的 字符串l_Rev复制到 结构体TFusionRec ,进而获取结构体每个成员变量(nFiberType和nTimeSec) 的值。
//定义一个结构体
type
PFusionRec = ^TFusionRec;
TFusionRec = packed Record
nFiberType :Integer;
nTimeSec :Integer;
end;
//应用部分
var
pFusion :PFusionRec;//定义一个结构体指针
strDisplay:string;
begin
New(pFusion);
try
if l_icount >=132 then
begin
CopyMemory(@pFusion,@l_Rev,l_icount);
strDisplay := '熔接时间:'+ IntToStr(pFusion^.nFiberType)
+ '; 熔接模式:'+ IntToStr(pFusion^.nTimeSec);
l_icount := 0;
mem_RevData.Lines.Add(IntToStr(pFusion^.nFiberType));//mem_RevData是Tmemo控件名
end;
finally
Dispose(pFusion);
end;
end;
一切错误的根源是:CopyMemory(@pFusion,@l_Rev,l_icount);
1、若用CopyMemory(@pFusion,@l_Rev,l_icount); 跟踪调试 数据pFusion^.nFiberType及pFusion^.nTimeSec均是正确的,但是执行后会报错
2、若用CopyMemory(pFusion,@l_Rev,l_icount);不会报错,但是数据pFusion^.nFiberType及pFusion^.nTimeSec均不正确,是随机值,达不到要求。
请大侠指点,在此表示感谢!
------解决方案--------------------
procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
CopyMemory(@pFusion,@l_Rev,l_icount);
1. CopyMemory的前两个参数都是指针,你“pFusion :PFusionRec;//定义一个结构体指针”,所以第一个参数前不用@;
2. 从你的代码中判断“if l_icount >=132 then”;也就是说l_icount的长度肯定是超过131的,
type
PFusionRec = ^TFusionRec;
TFusionRec = packed Record
nFiberType :Integer;
nTimeSec :Integer;
end;
你定义的TFusionRec才站8个Byte,而你却拷贝了至少131个字符到里面,肯定会触发访问非法内存的错误!!!
修改: CopyMemory(pFusion,@l_Rev,SizeOf(pFusion));
------解决方案--------------------
或许这样写更明显:
CopyMemory(@pFusion.nFiberType, @I_Rev[1], I_icount);
前两个参数分别是目标内存序列的起始地址,和来源内存序列的起始地址。总之就是要绕过类对象的变量名(其实是一个指针)。
delphi copymemory函数拷贝字符串到结构体中
代码的目的,是将接收过来的 字符串l_Rev复制到 结构体TFusionRec ,进而获取结构体每个成员变量(nFiberType和nTimeSec) 的值。
//定义一个结构体
type
PFusionRec = ^TFusionRec;
TFusionRec = packed Record
nFiberType :Integer;
nTimeSec :Integer;
end;
//应用部分
var
pFusion :PFusionRec;//定义一个结构体指针
strDisplay:string;
begin
New(pFusion);
try
if l_icount >=132 then
begin
CopyMemory(@pFusion,@l_Rev,l_icount);
strDisplay := '熔接时间:'+ IntToStr(pFusion^.nFiberType)
+ '; 熔接模式:'+ IntToStr(pFusion^.nTimeSec);
l_icount := 0;
mem_RevData.Lines.Add(IntToStr(pFusion^.nFiberType));//mem_RevData是Tmemo控件名
end;
finally
Dispose(pFusion);
end;
end;
一切错误的根源是:CopyMemory(@pFusion,@l_Rev,l_icount);
1、若用CopyMemory(@pFusion,@l_Rev,l_icount); 跟踪调试 数据pFusion^.nFiberType及pFusion^.nTimeSec均是正确的,但是执行后会报错
2、若用CopyMemory(pFusion,@l_Rev,l_icount);不会报错,但是数据pFusion^.nFiberType及pFusion^.nTimeSec均不正确,是随机值,达不到要求。
请大侠指点,在此表示感谢!
------解决方案--------------------
procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
CopyMemory(@pFusion,@l_Rev,l_icount);
1. CopyMemory的前两个参数都是指针,你“pFusion :PFusionRec;//定义一个结构体指针”,所以第一个参数前不用@;
2. 从你的代码中判断“if l_icount >=132 then”;也就是说l_icount的长度肯定是超过131的,
type
PFusionRec = ^TFusionRec;
TFusionRec = packed Record
nFiberType :Integer;
nTimeSec :Integer;
end;
你定义的TFusionRec才站8个Byte,而你却拷贝了至少131个字符到里面,肯定会触发访问非法内存的错误!!!
修改: CopyMemory(pFusion,@l_Rev,SizeOf(pFusion));
------解决方案--------------------
或许这样写更明显:
CopyMemory(@pFusion.nFiberType, @I_Rev[1], I_icount);
前两个参数分别是目标内存序列的起始地址,和来源内存序列的起始地址。总之就是要绕过类对象的变量名(其实是一个指针)。