我有一个 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 回调。 关于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/