用sendmessage()发送数据,第一次成功,以后都失败,为什么?

时间:2021-09-07 20:03:08
我在MFC中用
::SendMessage( ToWindowHandle, WM_COPYDATA, (WPARAM)m_hWnd, (LPARAM)&Data)
发送数据给一个应用程序,只有第一次成功,以后都失败了。
重新启动程序后,也是如此(第一次发送成功),为什么?

18 个解决方案

#1


我是在一个dialog中发出消息的。

#2


因为 ,SendMessage没有正确返回.
SendMessage 等到消息正确到达目地窗口以后才 返回~
用PostMessage 是将消息送入 消息循环泵就立刻返回 不论是否成功到达目地窗口

#3


楼上的解释很清晰!

#4


可是我用PostMessage第一次都失败。

#5


别老是只说失败失败,失败后你有没有看看GetLastError()是多少?错在什么地方??

#6


WM_COPYDATA 只能用 SendMessage , 不用用 PostMessage

#7


可以调试一下接收 WM_COPYDATA 消息的那个应用程序。

返回值是可以控制的,人家想返回什么就返回什么。

#8


我以前也遇到和楼主一样的问题,我就是用postmessage 解决的,还可以不用消息机制来解决,用其他的方法来实现,比如可以用标志位方面的也可以,

#9


接受程序不是我写得的,他只提供了一个API例子程序,是使用控制台输入字符串命令,然后将其用SendMessage发出,运行正确。而我在MFC中用switch...case判断,用SendMessage直接发出命令字符串。程序可以运行,其余部分也都正常,只有用SendMessage发送数据时,第一次返回值为TRUE,以后均为FALSE。因为需要接受程序响应,应该不能用postmessage吧。

to: uoyevoli(爱什么呢?) 
谢谢,我试一下。

#10


用SendMessage发送WM_COPYDATA 讨论过一次返回的问题
要不,换别的方法试试

#11


我用GetLastError()得到的信息是“重叠的I/O操作在进行中“。
是否因第一次SendMessage发送WM_COPYDATA堵塞了消息队列?需要特定的返回值?重新初始化?
求教!!

to: oyljerry(☆勇敢的心☆-㊣Project Coding㊣)
“用SendMessage发送WM_COPYDATA 一次返回的问题“ 是什么意思?
 请问有什么其他的好方法?

#12


当使用postmessage时,GetLastError()得到的信息是“消息只能与同步操作一起使用“。
postmessage必须同步吗?

#13


关注+学习

#14


接受程序不是我写得的,他只提供了一个API例子程序,是使用控制台输入字符串命令,然后将其用SendMessage发出,运行正确。而我在MFC中用switch...case判断,用SendMessage直接发出命令字符串。程序可以运行,其余部分也都正常,只有用SendMessage发送数据时,第一次返回值为TRUE,以后均为FALSE。因为需要接受程序响应,应该不能用postmessage吧。

to: uoyevoli(爱什么呢?) 
谢谢,我试一下。

---------------------------------------
个人 猜测 (是猜哦!)如果你的 数据符合接受消息程序的 要求
就是 那个 人提供的 接受消息程序 有问题~不够健壮

#15


程序的运行机制是这样的:先广播一个请求消息(已注册,唯一),接受程序返回一个同意请求消息(含有接口句柄),我的程序获得接口句柄后,向此句柄发送sendmessage WM_COPYDATA。

#16


为什么没人回答,难道我问得不够详细?

#17


帮你顶顶!:)
学习

#18


我已经解决了,在每次发送sendmessage  WM_COPYDATA之前都广播一次请求消息就可以了,
但仍不知道具体原因,因为不知道接受端的消息机制,只能分析demo程序,且demo程序并不这么做。
好了,结贴了。

#1


我是在一个dialog中发出消息的。

#2


因为 ,SendMessage没有正确返回.
SendMessage 等到消息正确到达目地窗口以后才 返回~
用PostMessage 是将消息送入 消息循环泵就立刻返回 不论是否成功到达目地窗口

#3


楼上的解释很清晰!

#4


可是我用PostMessage第一次都失败。

#5


别老是只说失败失败,失败后你有没有看看GetLastError()是多少?错在什么地方??

#6


WM_COPYDATA 只能用 SendMessage , 不用用 PostMessage

#7


可以调试一下接收 WM_COPYDATA 消息的那个应用程序。

返回值是可以控制的,人家想返回什么就返回什么。

#8


我以前也遇到和楼主一样的问题,我就是用postmessage 解决的,还可以不用消息机制来解决,用其他的方法来实现,比如可以用标志位方面的也可以,

#9


接受程序不是我写得的,他只提供了一个API例子程序,是使用控制台输入字符串命令,然后将其用SendMessage发出,运行正确。而我在MFC中用switch...case判断,用SendMessage直接发出命令字符串。程序可以运行,其余部分也都正常,只有用SendMessage发送数据时,第一次返回值为TRUE,以后均为FALSE。因为需要接受程序响应,应该不能用postmessage吧。

to: uoyevoli(爱什么呢?) 
谢谢,我试一下。

#10


用SendMessage发送WM_COPYDATA 讨论过一次返回的问题
要不,换别的方法试试

#11


我用GetLastError()得到的信息是“重叠的I/O操作在进行中“。
是否因第一次SendMessage发送WM_COPYDATA堵塞了消息队列?需要特定的返回值?重新初始化?
求教!!

to: oyljerry(☆勇敢的心☆-㊣Project Coding㊣)
“用SendMessage发送WM_COPYDATA 一次返回的问题“ 是什么意思?
 请问有什么其他的好方法?

#12


当使用postmessage时,GetLastError()得到的信息是“消息只能与同步操作一起使用“。
postmessage必须同步吗?

#13


关注+学习

#14


接受程序不是我写得的,他只提供了一个API例子程序,是使用控制台输入字符串命令,然后将其用SendMessage发出,运行正确。而我在MFC中用switch...case判断,用SendMessage直接发出命令字符串。程序可以运行,其余部分也都正常,只有用SendMessage发送数据时,第一次返回值为TRUE,以后均为FALSE。因为需要接受程序响应,应该不能用postmessage吧。

to: uoyevoli(爱什么呢?) 
谢谢,我试一下。

---------------------------------------
个人 猜测 (是猜哦!)如果你的 数据符合接受消息程序的 要求
就是 那个 人提供的 接受消息程序 有问题~不够健壮

#15


程序的运行机制是这样的:先广播一个请求消息(已注册,唯一),接受程序返回一个同意请求消息(含有接口句柄),我的程序获得接口句柄后,向此句柄发送sendmessage WM_COPYDATA。

#16


为什么没人回答,难道我问得不够详细?

#17


帮你顶顶!:)
学习

#18


我已经解决了,在每次发送sendmessage  WM_COPYDATA之前都广播一次请求消息就可以了,
但仍不知道具体原因,因为不知道接受端的消息机制,只能分析demo程序,且demo程序并不这么做。
好了,结贴了。