CoReleaseMarshalData用法

时间:2013-07-03 02:42:44

标签: com marshalling

我有一个线程A(主STA线程),它创建一个COM对象并希望将其传递给另一个线程,因此我使用CoMarshalInterface API。

线程B(MTA / STA无关紧要)处理许多类型的事件,其中一个事件是接收流并调用CoUnmarshalInterface来获取代理对象。

由于对CoUnmarshalInterface的调用可能会失败(出于任何原因),如果发生,我必须调用CoReleaseMarshalData来释放流数据,但MSDN文档说:

  

重要提示:您必须同时调用CoReleaseMarshalData功能   叫CoMarshalInterface的公寓将对象编组进去   流。不这样做可能会导致对象引用   流中的封送数据包将被泄露。

所以,在线程A中,我在CoMarshalInterface调用之后实现了等待,并检查CoUnmarshalInterface是否成功但问题是在我等待时,如果线程B或另一个做了远程-com操作,因为线程A被阻塞等待结果,我得到了死锁。

我也试过使用CoWaitForMultipleHandles而没有运气。

真的需要在同一间公寓打电话给CoReleaseMarshalData吗?你知道另一种处理方法吗?

1 个答案:

答案 0 :(得分:0)

你遇到的问题似乎与编组本身无关。是的,您执行CoUnmarshalInterface以从您创建它的公寓中释放编组流,但问题似乎是线程同步,而不是编组本身:

  

所以,在线程A中,我在CoMarshalInterface调用之后实现了一个等待,并检查CoUnmarshalInterface是否成功但问题是当我等待时,如果线程B或另一个进行了远程com操作,因为线程A是阻止等待结果,我陷入僵局。

当您手上有流并将呼叫发送到另一间公寓时,重要的是您的等待时间。由于您在STA中,您仍应在等待时在线程上调度窗口消息(例如,使用MsgWaitForMultipleObjectsEx)。相反,你假设该块将是短期的,并且消息可以等待一段时间。然后,如果你有一个依赖于线程A上的消息调度的反向调用 - 这就是死锁的来源。

所以问题首先是阻塞STA线程,包括阻塞消息调度。等待发送消息,或者将流放到安全的地方以便以后发布,您不需要快点CoUnmarshalInterface,并且您可以在第一次方便时释放资源。