1. 程式人生 > >關於MOVE 和 CopyMemory 的用法區別

關於MOVE 和 CopyMemory 的用法區別

ffffff ray 框架 com nbsp 應該 ## end 一個數

最近做了一個數據采集服務器, 根據程序的框架,使用了大量的指針結構體(內存塊) 操作。

例子:

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 的用法區別