multithreading - COM 线程模型 - 永久的困惑

标签 multithreading com model

我一直在阅读有关 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/

相关文章:

c++ - 我应该选择哪个 VC++ 运行时版本——静态还是动态?

c++ - 如何显示不同文件夹中多个文件的系统上下文菜单?

带有子字段的 Extjs 模型字段

r - RMA 随机效应元分析中如何 I^2 ==0(异质性测量)?

java - 从文件中保存和加载 SMO weka 模型

c# - "thread safe"的真正含义......在实际中

java - 干扰线程

用于连接两个 Bstr 字符串的 C++ 代码

python - 在 PyQt6 中尝试使用信号终止线程中的函数失败

java - 为什么使用 volatile 使 long 和 double atomic