是否需要编组支持线程模型“两者”的com对象

时间:2010-08-11 15:32:26

标签: com atl

我们在in-proc-server(.dll)中给出了线程模型“Both”。我注意到注册表编辑器中的线程模型。我们知道使用“Both”创建的com对象将采用线程的线程模型创建对象。我在STA线程中实例化对象,以确保对com对象的调用应该只通过一个线程。我正在以子序列方式从子线程调用此对象的方法,其中对象实际上是在主(STA)线程中创建的

它会产生任何副作用吗?

我没有得到任何错误,并且当我在子线程中使用对象时没有任何编组(GIT)时执行正常。

现在我的疑问是它是怎么发生的。当我谷歌时,我没有得到任何明星方式的回答。请给我一个简短的描述

根据我的理解,如果对象支持“STA”,则需要对对象进行编组吗?这里我们的对象支持“Both”。

2 个答案:

答案 0 :(得分:2)

this very good explanation。是否使用编组将取决于对象和呼叫者是否在同一个公寓中。如果我说得对,你调用CoInitializeEx()将一个线程放入STA,然后从该线程调用CoCreateInstance() - 该对象将在同一个STA中创建,因此原始创建者线程将与之通信它直接。另一个线程将如何使用该对象将取决于公寓配置。从你的问题中不清楚另一个线程是否调用CoInitializeEx()以及对象指针是如何传递给它的。如果你只是传递一个原始指针,那么就没有办法打开编组方式。

当您将指针传递给另一个线程时,您可能会遇到实际问题。 Part two of the above article你永远不应该在公寓之间传递原始指针。但是看起来你的情况是该规则的一个例外。 COM类被标记为具有Both线程模型,因此它必须是完全线程安全的,因此可以同时从多个线程调用其方法。我不确定这一点,但看起来你很安全。

答案 1 :(得分:0)

是的,因为您正在一个公寓中创建一个对象并在另一个公寓中调用方法。你还没有面临任何副作用。我认为因为你的对象很简单(没有回调,连接点等)。但它可能会改变。

相关问题