我一直在阅读有关 COM 线程模型的 MSDN 文章。在 one of those ,我遇到了以下行:
Like other servers, in-process servers can be single-threaded, apartment-threaded, or free-threaded.
我对放置什么(COM 客户端线程和 COM 服务器对象)以及放置在何处感到困惑。
如果 COM 客户端线程调用
<CoInitializeEx(COINIT_MULTITHREADED)
,是否会在可能有多个对象的 MTA 上创建对象并将该线程放入其中?如果
CoInitializeEx(NULL)
,如果不存在,它会创建一个新的单元并将该对象和线程放入其中吗?如果客户端不调用
CoInitialize
,那么它会创建一个“主机”线程,创建对象并将对象和线程放入其中?这就是上面提到的单线程吗?
最佳答案
据我所知,这句话的目的是为了制造困惑。
COM 服务器不太可能在注册表中通过 ThreadingModel 值声明它们支持的线程模型。这通常是“公寓”(或丢失,同样的事情)。 COM 将创建一个 STA 线程为其提供一个安全的家。仅当它显示“两者”或“自由”时,才会在您的线程上创建对象,并且不需要编码(marshal)处理。
是的,这会创建一个 STA 单元,并且该对象将驻留在该线程上,无论其 ThreadingModel 为何。
不调用 CoInitialize 将使任何 COM API 失败,包括尝试创建 COM 对象。
关于multithreading - COM 线程模型 - 永久的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4009847/