【问题标题】:Threading, com+ calls with SendMessage messaging使用 SendMessage 消息传递的线程、com+ 调用
【发布时间】:2012-04-03 21:49:00
【问题描述】:

我有一个应用程序,它创建了一个线程,该线程通过 Windows 消息与主 UI 进行通信。它只是将消息发送到主应用线程并接收状态。

这样我可以显示模态窗口并做其他事情。

问题是当我必须显示一个调用 com+ 服务器的表单时。 这样我会收到 OLE 错误 8001010D:无法进行传出调用,因为应用程序正在调度输入同步调用。

我认为这是因为主 SendMessage 正在使用中,而 com+ 调用需要 Windows 消息传递来完成其任务。

无论如何,在 delphi 中,我无法从线程中显示表单,但是我该如何解决这个问题...?

谢谢

编辑:

  1. MAIN(UI) 2. 线程

A.线程(2)向主线程(1)发送消息 B. 主线程(1) 接收到消息,然后让它回到线程 它显示窗口。 C. 主线程模态窗口要com+调用,出现上述错误。


  1. 模态窗口在哪个线程中? 2. COM 调用来自哪个线程? 3. COM 对象是在哪个线程中实例化的? 4.后台线程是否用STA初始化? 5. 模式表单是否从 SendMessage 处理程序中显示? – Roman R. 2 分钟前

    1. 主要
    2. 主要
    3. 主要
    4. CoInitializeEx(nil, COINIT_MULTITHREADED);
    5. 是的。

【问题讨论】:

  • 1. 模态窗口在哪个线程中? 2. COM 调用来自哪个线程? 3. COM 对象是在哪个线程中实例化的? 4.后台线程是用STA初始化的吗? 5. 是否从 SendMessage 处理程序显示模态表单?
  • 我添加了有关该主题的更多信息。
  • 我喜欢@RomanR。解决方案(+1)。但是您是否尝试使用Synchronize 在主VCL 线程中调用com+?
  • @kobik 不,我没有,因为我没有使用 TThread 的 delphi 类。如果我用过,我可能会试一试。要更改很多代码以检查它...

标签: delphi winapi com delphi-7


【解决方案1】:

问题的原因是在处理SendMessage 请求时,COM 无法封送传出的 COM 调用。出现的错误是您所指的RPC_E_CANTCALLOUT_ININPUTSYNCCALL (0x8001010D)我的印象是这只适用于作为传入线程间 COM 请求一部分的 SendMessage 调用,但这可能是一个错误的假设。

您的典型解决方法是将您的SendMessage 替换为PostMessage,然后等待同步对象、事件或信号量。这样,您的调用者后台线程不会保持消息同步调用并自主等待,在主线程上,消息通过常规消息队列分派并最终到达相同的处理程序。

作为奖励,您可以选择安全地终止后台线程。如果当前它被等待模式对话框的 SendMessage API 锁定,建议的更改将让您从主线程发出同步对象信号并让它继续运行,例如如果你想安全地终止它。

另一种解决方案可能是调用 InSendMessage 函数,如果为真 - 延迟模式 UI,例如再次向自己发布一条消息,以便稍后在另一个消息处理程序中弹出表单。

【讨论】:

  • 像魅力一样工作。谢谢。
猜你喜欢
  • 2021-09-04
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 2021-07-08
  • 2021-03-27
相关资源
最近更新 更多