请各位大侠解决在TMemoryStream.Read时,Buffer地址发生变化,退出事件时报错'Privileged instruction'。(200分)

  • 主题发起人 主题发起人 lwen
  • 开始时间 开始时间
L

lwen

Unregistered / Unconfirmed
GUEST, unregistred user!
请各位大侠解决在TMemoryStream.Read时,Buffer地址发生变化,退出事件时报错。
代码如下
procedure TForm1.Button1Click(Sender: TObject);
type
PMyRec = ^TMyRec;
TMyRec = Record
a: Integer;
b: Double;
c: array[0..7] of Char;
end;
var
MStream: TMemoryStream;
pBuffer, lBuffer: PMyRec;
aRecord, rRecord: TMyRec;
begin
pBuffer := New(PMyRec);
pBuffer := @aRecord;
lBuffer := New(PMyRec);
lBuffer := @rRecord;

with aRecord do
begin
a := 12345;
b := pi;
c := 'Hello'#0;
end;

with rRecord do
begin
a := 54321;
b := pi+111;
c := 'dasd'#0;
end;

ShowMessage(format('a: %d, b: %f, c: %s', [aRecord.a, aRecord.b, aRecord.c]));
ShowMessage(format('a: %d, b: %f, c: %s', [pBuffer.a, pBuffer.b, pBuffer.c]));

MStream := TMemoryStream.Create;
MStream.Position := 0;
MStream.Write(pBuffer, SizeOf(TMyRec));

MStream.Position := 0;
MStream.Read(lBuffer, SizeOf(TMyRec));


CopyMemory(@rRecord, lBuffer, SizeOf(TMyRec));

ShowMessage(format('a: %d, b: %f, c: %s', [rRecord.a, rRecord.b, rRecord.c]));
ShowMessage(format('a: %d, b: %f, c: %s', [lBuffer.a, lBuffer.b, lBuffer.c]));

MStream.Free;
end;

出错信息:raised exception class EPrivilege with message 'Privileged instruction'.
 
MStream := TMemoryStream.Create;
MStream.Position := 0;
MStream.Write(pBuffer^, SizeOf(TMyRec));

MStream.Position := 0;
MStream.Read(lBuffer^, SizeOf(TMyRec));
 
多谢赐教,正在调试。
 
请问为什么要改成
MStream.Read(lBuffer^, SizeOf(TMyRec));
小弟Delphi学的不好,还请大侠帮忙,谢谢!
 
指针,
你的问题是否解决了呢.
 
这个问题以前的帖子讨论的已经很多了。
你可以跟踪一下T***Stream.read,可以发现它是调用move来实现的,那么move是怎样实现的呢?
再跟踪一下你就发现了。。。[:D]
 
问题已经解决。
请savenight给推荐一下这方面的资料,我想掌握好它。
 
也请hbezwwl给推荐一下学好这方面的资料,谢谢。
 
中文的资料我觉得陈经韬写得比较清晰一些。
http://go4.163.com/lovejingtao/mystream.htm
至于英文的,网上太多了。
 
谢谢!
谢谢大家。
 
在调用MStream.Read(lBuffer, SizeOf(TMyRec));
后lBuffer的地址为什么变了
 
在调用MStream.Read(lBuffer, SizeOf(TMyRec));
后lBuffer的地址为什么变了
 
多人接受答案了。
 
后退
顶部