【问题标题】:How can I tell which thread a COM object is associated with? (STA)如何判断 COM 对象与哪个线程相关联? (STA)
【发布时间】:2020-11-28 01:38:12
【问题描述】:

我认为托管和非托管 STA 代码之间存在 COM 互操作问题,我认为这是由于尝试从错误线程调用 COM 对象所致。

有没有办法在 STA 设置中真正告诉 COM 对象“属于”哪个线程/单元?我在 C++ 或 C# 中都找不到方法,但两者都有用!

是否有 API 可以做到这一点?

【问题讨论】:

  • 公寓类型(基本上是 STA 与 MTA)是通过调用 CoInitialize(Ex) 定义的。通常是调用此 API 的线程创建者,这在 .NET 中通常是隐式的(或基于属性的,如 STAThreadAttribute)。只有一个 MTA。您可以确定线程所在的公寓的类型(GetApartmentState)。现在,在此线程执行期间创建的每个对象都将存在于该单元中(如果线程是 STA,则为 MTA 或 STA)。
  • @SimonMourier 是的,这就是我的观点,在 STA 中我怎么知道是哪一个?从错误的线程调用 COM 对象很容易——C++ 似乎允许你,它甚至可以工作。所以检查会很方便。
  • AFAIK 没有这样的 api,但如果您控制对象的创建时间以及在哪个线程上创建,则不需要它。
  • 此外,在 C# 中,如果您从错误的线程调用 STA COM-server,.net 将在内部将此调用分派到正确的 STA 线程,然后将调用的结果分派回调用者线程。因此,在 C# 中,从任何线程调用 COM 都是合法的(但您仍然需要注意防止 STA 线程锁定)。

标签: c# c++ com interop


【解决方案1】:

您在解决方案中添加引用并添加对 COM 库的引用,您将获得一个带有一组接口和对象的新命名空间。它们您使用 new 来实例化其中一个对象。
这种方式对调用线程模型没有限制。
在此处获取帮助:
Understanding and Using COM Threading Models
Understanding COM Apartments, Part I

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-15
    • 2012-04-08
    • 1970-01-01
    • 2016-04-29
    • 2020-09-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    相关资源
    最近更新 更多