使用SendMessage传递WM_COPYDATA消息发生异常:“因为应用程序正在发送一个输入同步呼叫,所以无法执行传出的呼叫”

zhouzhenyan 2008-07-23 01:59:38
用SendMessage在进程之间传递WM_COPYDATA时,当响应该消息执行到Create创建子窗体时,发生了异常0x8001010D: “因为应用程序正在发送一个输入同步呼叫,所以无法执行传出的呼叫。”此异常并不影响程序的执行,但还是希望找出解决办法,消除此异常。
查了一些资料,大概知道了产生此异常的原因,是因为在SendMessage后相应消息时,直接或间接地调用了对自己的SendMessage。那么如何解决呢?用PostMessage代替SendMessage?好像不行。大家有没有什么好办法?
...全文
811 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouzhenyan 2008-07-26
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 dbger 的回复:]
因为OLE中是同步调用,在COM组件中为防止死锁,禁止向其他进程窗口SendMessage

详细解释见微软说明:http://support.microsoft.com/kb/131056/en-us/
[/Quote]

学习了,明白了,呵呵。谢谢你,结贴:)
dbger 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zhouzhenyan 的回复:]
引用 13 楼 dbger 的回复:

应该跟COM组件内部的消息循环有关系。


能详细说明吗,谢谢,呵呵。
[/Quote]

因为OLE中是同步调用,在COM组件中为防止死锁,禁止向其他进程窗口SendMessage

详细解释见微软说明:http://support.microsoft.com/kb/131056/en-us/
zhouzhenyan 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 stivenjia 的回复:]
WM_COPYDATA
If the receiving application must access the data after SendMessage returns, it must copy the data into a local buffer

存储转发,WM_COPYDATA被响应后系统不在保存该数据。
[/Quote]

这个当然知道,现在讨论的是导致发生异常的原因。为什么用了ActiveX控件就会发生异常。
stivenjia 2008-07-25
  • 打赏
  • 举报
回复
WM_COPYDATA
If the receiving application must access the data after SendMessage returns, it must copy the data into a local buffer

存储转发,WM_COPYDATA被响应后系统不在保存该数据。
zhouzhenyan 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 dbger 的回复:]

应该跟COM组件内部的消息循环有关系。
[/Quote]

能详细说明吗,谢谢,呵呵。
CrazyMan1984 2008-07-25
  • 打赏
  • 举报
回复
使用API的SendMessage。
1.发送WM_COPYDATA必须使用SendMessage,PostMessage不安全。
2.使用::SendMessage(HWND,UINT,WPARAM,LPARAM)发送消息。
gavin1203 2008-07-25
  • 打赏
  • 举报
回复
楼主SendMessage是同步函数,基本不会出现你说的情况...
zhouzhenyan 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 scq2099yt 的回复:]
呵呵,愿意听听sendmessage和WM_COPYDATA的机制。
因为我以前在插件和对话框通信时本来打算用WM_COPYDATA,但是没成功后来改成命名管道了。
[/Quote]

本来打算在发送端直接用postmessage,但是那样行不通,因为postmessage是异步的,COPYSTRUCT传入包含的是发送进程的地址,只能用sendmessage,等其返回后再结束进程。但就出现了那样的异常,按cnzdgs的方法转接了一下就可以了。
zhouzhenyan 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 cnzdgs 的回复:]
这要看你的子窗口是如何设计的,使用了什么特殊控件,调试看看具体执行到哪一步操作出错,通常情况创建窗口是不会有这种问题的。
[/Quote]

确实是这样,用了一个ActiveX控件,我发现没有用这个ActiveX控件的窗体创建就没有问题。应该是跟OLE相关的原因,呵呵。
cnzdgs 2008-07-24
  • 打赏
  • 举报
回复
这要看你的子窗口是如何设计的,使用了什么特殊控件,调试看看具体执行到哪一步操作出错,通常情况创建窗口是不会有这种问题的。
dbger 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhouzhenyan 的回复:]
引用 10 楼 cnzdgs 的回复:
这要看你的子窗口是如何设计的,使用了什么特殊控件,调试看看具体执行到哪一步操作出错,通常情况创建窗口是不会有这种问题的。


确实是这样,用了一个ActiveX控件,我发现没有用这个ActiveX控件的窗体创建就没有问题。应该是跟OLE相关的原因,呵呵。
[/Quote]

应该跟COM组件内部的消息循环有关系。
scq2099yt 2008-07-24
  • 打赏
  • 举报
回复
呵呵,愿意听听sendmessage和WM_COPYDATA的机制。
因为我以前在插件和对话框通信时本来打算用WM_COPYDATA,但是没成功后来改成命名管道了。
scq2099yt 2008-07-24
  • 打赏
  • 举报
回复
up
thirddata 2008-07-24
  • 打赏
  • 举报
回复
呵呵,这有啥好讨论的,说明楼主对sendmessage和WM_COPYDATA的机制不是很熟,自己把自己弄死了
zhouzhenyan 2008-07-23
  • 打赏
  • 举报
回复
自己顶一下,呵呵。
zhouzhenyan 2008-07-23
  • 打赏
  • 举报
回复
cnzdgs大哥的方法不错,问题已经解决,但我还不是很明白为什么会出现这样的异常,而且为什么会在创建子窗体的时候发生,请不吝赐教:)

先不结贴,大家再讨论,明天再加分。
zhouzhenyan 2008-07-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cnzdgs 的回复:]
响应WM_COPYDATA消息时,先把数据保存起来,给自己Post一个自定义消息,然后返回。在自定义消息中做剩下的处理。
[/Quote]

谢谢cnzdgs大哥,貌似这是个很不错的解决方法,应该可行,我先试一下,呵呵。先谢了,大家继续讨论:)
zhouzhenyan 2008-07-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]
当响应该消息执行到Create创建子窗体时,发生了异常0x8001010D:

??没看明白
在窗口还在创建的时候,发消息的?
[/Quote]

跟踪调试发现是在Create子窗体时发生异常,忽略程序还可以继续运行。
cnzdgs 2008-07-23
  • 打赏
  • 举报
回复
响应WM_COPYDATA消息时,先把数据保存起来,给自己Post一个自定义消息,然后返回。在自定义消息中做剩下的处理。
ouyh12345 2008-07-23
  • 打赏
  • 举报
回复
当响应该消息执行到Create创建子窗体时,发生了异常0x8001010D:

??没看明白
在窗口还在创建的时候,发消息的?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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