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);
前两个参数分别是目标内存序列的起始地址,和来源内存序列的起始地址。总之就是要绕过类对象的变量名(其实是一个指针)。