线程接收WM_COPYDATA消息,为什么收到的数据有乱码?

qi7 2004-11-13 04:31:19
如题!急。
...全文
414 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahbatima 2004-12-16
  • 打赏
  • 举报
回复
up学习
qi7 2004-12-07
  • 打赏
  • 举报
回复
up。
连个人影都见不着!
qi7 2004-12-02
  • 打赏
  • 举报
回复
up
lxtnt 2004-12-01
  • 打赏
  • 举报
回复
长度???
qi7 2004-11-30
  • 打赏
  • 举报
回复
哪位帮忙看看,我把源程序发给你。
在进程间通信用postMessage位什么不行?
nisazhixin 2004-11-29
  • 打赏
  • 举报
回复
帮顶
qi7 2004-11-29
  • 打赏
  • 举报
回复
能给个简单的例子吗?
beyondtkl 2004-11-29
  • 打赏
  • 举报
回复
如果是不同进程的话
WM_COPYDATA 分配的内存空间必须为全局的 不能为某一个进程的 私有空间
qi7 2004-11-29
  • 打赏
  • 举报
回复
请大家帮忙分析,现在还未解决。
qi7 2004-11-17
  • 打赏
  • 举报
回复
还有别的原因吗?
ysai 2004-11-15
  • 打赏
  • 举报
回复
COPYDATA发送的内存是有长度的,可能你访问了指定长度以外的内存,你需要接收到数据后先切下你需要的长度,其余的不属于你,不要访问也不要释放
qi7 2004-11-15
  • 打赏
  • 举报
回复
SendDataRec的内存是静态分配的。
如果是这的原因,为什么在主线程中接收正常?
halfdream 2004-11-15
  • 打赏
  • 举报
回复
偏偏关键部分楼主没有贴出来。。。
SendDataRec这块内存是什么时候分配的?哪儿分配的?静态?栈?堆?
怀疑问题出在这儿。。。

SendMessage(ProcHandle,WM_CopyData,Handle,LongInt(@SendDataRec));
//其中SendDataRec 为 DataInfoTB类型。
qi7 2004-11-15
  • 打赏
  • 举报
回复
不好意思,说错了。
var
SendDataRec : TCopyDataStruct;
begin
SendDataRec.cbData:=SizeOf(DataInfoTable);
SendDataRec.lpData:=@DataInfoTable;
end;
//DataInfoTable 为 DataInfoTB类型。
halfdream 2004-11-15
  • 打赏
  • 举报
回复
》》SendMessage(ProcHandle,WM_CopyData,Handle,LongInt(@SendDataRec));
》》//其中SendDataRec 为 DataInfoTB类型。

SendDataRec不应该是自定义类型的,应该是COPYDATASTRUCT类型。




var
cds:TCopyDataStruct;
data:DataInfoTB;
begin
// SendMessage(ProcHandle,WM_CopyData,Handle,LongInt(@SendDataRec));
cds.dwData:=0;
cds.cbData:=sizeof(data);
cds.lpData:=@data;

SendMessage(prohandle,WM_COPYDATA,handle,Longint(@cds));
end;
qi7 2004-11-15
  • 打赏
  • 举报
回复
我是只取了我需要的长度,没有访问指定长度外的内存。
您看上面的代码了吗?估计是哪的问题?
我程序中发送和接收用的都是静态分配的内存,发送和接收的record定义是一样的。而且,在主线程中接收就正常。
qi7 2004-11-14
  • 打赏
  • 举报
回复
我用线程分配的内存接收也试了,还是有乱码。
qi7 2004-11-14
  • 打赏
  • 举报
回复
整个代码太长,我把有关的代码帖出来了,请大侠指教。
qi7 2004-11-14
  • 打赏
  • 举报
回复
/////////////////////// thread ///////////////////////////////////
var
DataTB : DataInfoTB;
procedure TRecvThread.Execute;
begin
while not Terminated do
if WaitForSingleObject(FEvent.Handle,WaitTime*4)=Wait_Object_0 then
begin
PInsDataRec:=Pointer(FMessage.LParam);
Case PInsDataRec.dwData of
InsData:
begin
DataTable:=DataInfoTB(PInsDataRec.lpData^);
DealData;
if RefreshAlarm then
PostMessage(FrmData.Handle,RecvMessage,0,0);
end;
end;
end;
end;

procedure TRecvThread.RecvAllMessage(var Mess: TMessage);
begin
with Mess do
begin
if Msg=WM_CopyData then
begin
FMessage:=Mess;
FEvent.SetEvent;
end else
Result := DefWindowProc(FWinHandle, Msg, WParam, LParam);
end;
end;

///////////////定义///////////////////
type DataInfo = record
ddr : Word;
DataTime : TDateTime;
SolveData: array [1..6] of Double;
end;
type DataInfoTB = array [1..5] of DataInfo;

//每次是五个数据,前4个正常,最后一个数据不正常。
//////////////////////////// 发送端 ///////////////////////
SendMessage(ProcHandle,WM_CopyData,Handle,LongInt(@SendDataRec));
//其中SendDataRec 为 DataInfoTB类型。
把thread中的代码帖到主线程中接收到的数据就是正常的。
王集鹄 2004-11-14
  • 打赏
  • 举报
回复
你最好把可以调试的代码贴出来
加载更多回复(5)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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