关于指针拷贝的疑惑....

mdejtod 2011-07-08 11:53:07
加精
代码如下:

//这段代码在ontest中可以正常接收到发过来的信息
procedure TForm1.btn1Click(Sender: TObject);
var pdata :array[0..4] of Byte ;
i : Integer;
begin
FillChar(pdata,5,0);
for i := 0 to 4 do
begin
pdata[i] := i * 10;
end;
PostMessage(Handle,WM_TEST,5,LongWord(@pdata[0]));
end;

procedure TForm1.OnTest(var Msg: TMessage);
var pd : array[0..4] of Byte;
i : Integer;
begin
CopyMemory(@pd[0],Pointer(Msg.LParam),5);
for i := 0 to Msg.WParam - 1 do
begin
ShowMessage(IntToStr(pd[i]));
end;
end;

//下面代码也可以正常接收,只是showmessage后会报错,不知什么原因
procedure TForm1.btn1Click(Sender: TObject);
var pdata :pByte ;
i : Integer;
begin
GetMem(pdata,5);
FillChar(pdata^,5,0);
for i := 0 to 4 do
begin
pdata^ := i * 10;
inc(LongWord(pdata),1);
end;
inc(LongWord(pdata),-5);
SendMessage(Handle,WM_TEST,5,LongWord(@pdata));
FreeMem(pdata,5);
end;

procedure TForm1.OnTest(var Msg: TMessage);
var pd : pByte;
i : Integer;
aa : TBitmap;
begin
CopyMemory(@pd,Pointer(Msg.LParam),5);//拷贝正常,执行完毕报错
//Move(Pointer(Msg.LParam)^,(@pd)^,5);//正常
for i := 0 to Msg.WParam - 1 do
begin
ShowMessage(IntToStr(pd^));
if i < Msg.WParam - 1then
Inc(LongWord(pd),1);
end;
end;


哪位达人解释一下
另外 能不能通过 InterlockedExchange 这个PAI直接为pd指向一个地址?
...全文
2361 72 打赏 收藏 转发到动态 举报
写回复
用AI写文章
72 条回复
切换为时间正序
请发表友善的回复…
发表回复
ITCore168 2011-07-17
  • 打赏
  • 举报
回复
不太明白.......
chenxiaolin123000 2011-07-14
  • 打赏
  • 举报
回复
学习了,多多指教
rainychan2009 2011-07-13
  • 打赏
  • 举报
回复
或者,申请PByte类型,但是操作的时候,强制转换成PChar
procedure TForm1.btn1Click(Sender: TObject);
var
pb: PByte;
i: Integer;
tmp: Pointer;
begin
pb := nil;
pb := GetMemory(5 * SizeOf(Char));
FillChar(PChar(pb)[0], SizeOf(pb), #0);
for i := 0 to 4 do
begin
PChar(Pb)[i] := Char(i + Ord('A'));
end;
SendMessage(Handle, WM_CopyPointer, 5, Integer(pb));
Dec(Integer(PChar(pb)), 5 * SizeOf(Char));
FreeMemory(pb);
end;

procedure TForm1.ResponseCopyPointer(var AMsg: TMessage);
var
pb: PByte;
I: Integer;
begin
pb := GetMemory(5 * SizeOf(Char));
FillChar(PChar(pb)[0], SizeOf(pb), #0);
CopyMemory(pb, Pointer(AMsg.LParam), AMsg.WParam);
for i := 0 to AMsg.WParam - 1 do
begin
ShowMessage(Format('%d', [Ord(PChar(pb)[i])]));
end;
Dec(PChar(pb), SizeOf(Char) * 5);
FreeMemory(pb);
end;
//输出65,66,67,68,69
rainychan2009 2011-07-13
  • 打赏
  • 举报
回复
我看了楼主的帖子,然后自己动手写了下,不过总觉得用PByte没有PChar来的爽快。
procedure TForm1.btn1Click(Sender: TObject);
var
pb: PChar;
i: Integer;
tmp: Pointer;
begin
pb := nil;
pb := GetMemory(5 * SizeOf(Char));
FillChar(pb[0], SizeOf(pb), #0);
for i := 0 to 4 do
begin s
Pb[i] := Char(i + Ord('A'));
end;
SendMessage(Handle, WM_CopyPointer, 5, Integer(pb));
Dec(Integer(pb), 5 * SizeOf(Char));
FreeMemory(pb);
end;

procedure TForm1.ResponseCopyPointer(var AMsg: TMessage);
var
pb: PChar;
I: Integer;
begin
pb := GetMemory(5 * SizeOf(Char));
FillChar(pb[0], SizeOf(pb), #0);
CopyMemory(pb, Pointer(AMsg.LParam), AMsg.WParam);
for i := 0 to AMsg.WParam - 1 do
begin
ShowMessage(pb[i]);
end;
Dec(pb, SizeOf(Char) * 5);
FreeMemory(pb);
end;
这是我写的,用PChar简单多了吧。
niniu 2011-07-12
  • 打赏
  • 举报
回复
//这段代码在ontest中可以正常接收到发过来的信息
procedure TForm1.btn1Click(Sender: TObject);
var pdata :array[0..4] of Byte ;
i : Integer;
begin
FillChar(pdata,5,0);
for i := 0 to 4 do
begin
pdata[i] := i * 10;
end;
PostMessage(Handle,WM_TEST,5,LongWord(@pdata[0]));
end;

这段代码本身就有问题,pdate 是局部变量,从函数中退出后就被释放掉了,而PostMessage发送消息后立即返回,但是,返回并不代表该消息已经被处理,很有可能等消息被处理的时候,pdate已经被释放掉了,从而在消息处理函数中出现内存错误。
zhan7505201 2011-07-12
  • 打赏
  • 举报
回复
学习。
luke316 2011-07-12
  • 打赏
  • 举报
回复
参观学习
deutschlandchina 2011-07-12
  • 打赏
  • 举报
回复
进来学习
yuwei5877 2011-07-11
  • 打赏
  • 举报
回复
飘过~~
jitao_xa 2011-07-11
  • 打赏
  • 举报
回复
听课,蹭分
brettkk 2011-07-11
  • 打赏
  • 举报
回复
还没学delphi
k_badboy 2011-07-11
  • 打赏
  • 举报
回复
我真不明白,为什么delphi能够存活下来?
boxun123 2011-07-11
  • 打赏
  • 举报
回复
路过学习下
sirme128 2011-07-11
  • 打赏
  • 举报
回复
顶一下
wangchen310 2011-07-11
  • 打赏
  • 举报
回复
很赞,不错的程序哈
bjwooxun 2011-07-11
  • 打赏
  • 举报
回复
看看……
cwm5511 2011-07-11
  • 打赏
  • 举报
回复
路过,学习了,谢谢!!!
noodle123 2011-07-11
  • 打赏
  • 举报
回复
虽然社会在变迁,不变的是应用目标——小感慨一下。
eraser2011 2011-07-11
  • 打赏
  • 举报
回复
不错,看看!
ocean1208 2011-07-11
  • 打赏
  • 举报
回复
代码不错,支持
加载更多回复(49)

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧