请哪位高手指点一下:(0分)

  • 主题发起人 主题发起人 netbug
  • 开始时间 开始时间
N

netbug

Unregistered / Unconfirmed
GUEST, unregistred user!
我这里有两个程序,一个是发送消息的,请看:<br>procedure TForm1.Button1Click(Sender: TObject);<br>var i,j:integer;p1:^integer;<br>begin<br>&nbsp;i:=findwindow(nil,'form2');<br>&nbsp;j:=356;<br>&nbsp;getmem(p1,sizeof(j));<br>&nbsp;p1:=@j;<br>&nbsp;sendmessage(i,wm_user,integer(p1),0);<br>end;<br>与接受消息的,请看:<br>procedure mymessage1(var i:integer);message wm_user;<br>....<br>procedure TForm2.mymessage1(var i:integer);<br>var p2:^integer;<br>begin<br>p2:=ptr(i);<br>edit1.text:=inttostr(wm_user);<br>edit2.Text:=inttostr(p2^);<br>end;<br>我是想把第一个程序中的整数356也随着消息wm_user发送出去,在第二个程序<br>的edit2中得到,可是我在运行时,系统老是提示:Access Violation at address....,<br>(编译有通过),我想请问一下:我该如何做,才能把第一个程序中的整数356也<br>随着消息发送出去?谢谢.<br>
 
sendmessage(i,wm_user,j,0);<br>
 
你先试试<br>sendmessage(i,wm_user,356,0);<br>再试试<br>sendmessage(i,wm_user,0,p1);<br>
 
&gt;&gt;procedure mymessage1(var i:integer);message wm_user;<br>&nbsp; 参数怎么是整数?应该是TMessage类型吧.<br>如果只是想把356这个数传过去只要把它付给wParam就行.getmem(p1,sizeof(j))<br>已经把356个整数的起始地址赋给了p1,然后p1:=@j有把j这个变量的地址赋给p1.<br>sendmessage(i,wm_user,integer(p1),0)传送的消息的第一个参数是变量j的<br>地址.你到底要传哪一个呢?<br><br>运行出现异常可以跟踪一下是在哪一句出的错.
 
看来netbug是想在自定义消息(注:请不要直接用WM_User)中传送指针,然而这是不行<br>的,每个进程都有自己独立的内存空间,引用另一个进程的指针当然会发生错误.<br><br>就此问题,当然可以直接用wParam或者lParam传送整数值.但是如果要传送的数据较<br>多,那么可以申请共享内存,然后传递共享内存句柄.当然还有很多种进程通信方法.
 
当然要错,你的本意是传数据,但程序的意思确是传地址,<br>并且,在接受程序中你又引用了地址,当然要报非法访问的错误。
 
WM_COPYDATA 可以在程序间传递数据。<br><br>tqz 也回来了!!!!<br>这几天好多大虾都回来了,呵呵, 真高兴,
 
接受答案了.
 
后退
顶部