好吧,我怀疑即使把这个用在文字中,我也会遇到困难,因为我对COM和公寓的理解并不是真的可以胜任工作;-)
我有一个COM进程内服务器/组件(C++),它包含一些遗留代码.由于此遗留代码的限制,我需要确保COM组件的方法是:
我通过使用ThreadingModel =""注册服务器来实现的前两个.
第三个是我甚至遇到的一个问题.
服务器正由多线程客户端使用,我无法控制.它在不同的线程上创建服务器/组件的多个实例并调用它们的DoSomething()方法.
这导致选择挂起和崩溃行为,我看到堆栈跟踪在主STA线程上包含对DoSomething()的两次调用,但是对于服务器的不同实例.
我最初甚至不认为这是可能的,但我现在有一个部分理解,我需要知道是否/如何防止它.
我的阅读建议我可能需要以某种方式使用IMessageFilter,但我不确定这是否可以在服务器端完成,或者需要由客户端完成.
有人可以帮忙吗?
请注意我希望看到COM级别是否有任何答案,而不是寻找有关更改服务器代码与遗留代码交互方式的建议(例如,通过在自己的线程中运行遗留代码并实现我自己的代码) (非COM)将来自服务器的所有实例的调用编组到该线程上).
COM编组通过消息循环调用您的服务器.你可以通过COM模态循环进入重新入侵的地狱.该循环负责需要编组回客户端线程的传出调用.喜欢的事件.或者将您的服务器调用到位于不同STA公寓中的另一台服务器.虽然模态循环泵送消息,等待传出呼叫完成,但它可以接收传入呼叫,就像常规消息循环一样.
从技术上讲,当您的服务器试图通过自己提取消息来保持UI处于活动状态时,也会发生重新入侵.
是的,这可能是非常难以对付.我不知道有什么神奇的解决方法,而且我一直在努力寻找.我还看了IMessageFilter并得出结论,解决这个问题毫无用处.