visual-c++ - COM 出站调用导致 "An outgoing call cannot be made since the application is dispatching an input-synchronous call."

标签 visual-c++ com sta mta

我有一个 COM 服务器(C++/STA(基于 MFC 的应用程序))和一个 COM 客户端(C#/MTA)。 COM 服务器必须存在于 STA 中,因为它是一个 MFC 应用程序(我在这件事上别无选择)。客户端向服务器发出调用,服务器向客户端发出回调。这就是错误发生的地方( RPC_E_CANTCALLOUT_ININPUTSYNCCALL )。我猜如果服务器是 MTA,这个问题永远不会出现,但遗憾的是,MFC 的文档明确否认将公寓初始化为 MTA。

关于如何解决这个问题的任何想法?

我一直在玩弄让服务器对象(我通过运行对象表公开的对象)存在于它自己的公寓 (MTA) 中的想法。这是一个好主意,还是先尝试一些更简单的方法?

更新

服务器对象只是应用程序中某些功能的一个薄接口(interface)点。大多数情况下,它只是读取和写入内存位置,但在某些情况下,它会为应用程序中的各个窗口生成窗口消息。服务器对象本身并不是整个应用程序。

最佳答案

RPC_E_CANTCALLOUT_ININPUTSYNCCALL表示您试图从处理程序中对通过 SendMessage 发送的 Windows 消息进行编码 COM 调用.这是为了帮助避免某些死锁情况。您有许多选项,归结为“避免在 SendMessage 处理程序中调用 COM”:

  • 您可以使用 PostMessage为自己排队一条消息,并在该发布的消息处理程序中调用 COM 回调。
  • 您可以使用 asynchronous DCOM ,并避免阻塞消息处理程序中的调用结果。
  • 你可以 marshal the callback interface ,然后从 thread pool work item 调用它.由于它独立于主应用程序的消息循环,因此它不会在 SendMessage 调用中,甚至可以在 MTA 中。
  • 您可以放弃 MFC COM 支持,并调用 CoRegisterClassObject直接从另一个线程。这意味着对服务器 COM 对象的任何调用都将从 COM 线程池(或者,如果您使用 STA 线程,则从该线程)调用,而不是从 MFC UI 线程调用,因此您需要使用 Windows 消息进行通信跨线程;但是如果您需要向客户端进行同步调用,这可能是最好的方法。
  • 关于visual-c++ - COM 出站调用导致 "An outgoing call cannot be made since the application is dispatching an input-synchronous call.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6610202/

    相关文章:

    c++ - 如何制作 C 宏预构建预处理器?

    python - Python 中的 COM 对象(arcobjects)

    com - COM 中的 NULL 输入/输出参数

    C++ DLL 较新版本

    c# - 在STAThread和MTAThread之间切换以及内存泄漏

    .net - STA线程模式线程也会阻塞winform UI线程?

    c++ - MFC CListCtrl::SetItemText() 不工作

    c++ - 如何理解 C++ 中的_Function_class_(name)

    c# - 如何告诉线程池在 `STA` 线程上运行委托(delegate)?

    visual-c++ - Visual C++ 中的 128 位除法内在函数