【问题标题】:How to access COM objects from different apartment models?如何从不同的公寓模型访问 COM 对象?
【发布时间】:2011-10-10 16:08:21
【问题描述】:

我有一个多线程 C++Builder GUI 应用程序,它通过 COM 与第三方应用程序通信。

我需要从多个线程调用 COM 对象的方法,并且我正在使用互斥体保护访问。显然,主 GUI 线程必须使用 STA 模型,但我的工作线程需要使用 MTA。 COM 对象是在 MTA 线程中构造的。

由于 MTA/STA 不匹配,一切正常除了从 GUI 线程访问 COM 对象。

我读过一些关于编组的文章,但没有尝试实现它,因为我看到的示例似乎需要不同的访问语义,具体取决于当前的公寓模型,我真的很想有这样的代码(来自程序员的 POV)不关心当前的公寓模型。

那么,是否有一种惯用的方式来编写在“相同”对象上运行但可以从 STA 和 MTA 线程调用的 COM 代码?

【问题讨论】:

  • 封送接口指针是必需的,你不能跳过它。 IGlobalInterfaceTable 让它变得简单。
  • @Hans,是的,但是如果我说得对,有些线程需要编组指针,而其他线程需要未编组的指针?我正在寻找一种方法来统一它或根据当前线程单元模型动态切换哪个接口指针......?
  • 好吧,只是总是编组指针。如果不需要转换公寓,您只需拿回原件即可。
  • @Hans,如果您将答案放在 cmets 中,Roddy 应该如何接受? :-) 这个问题被列为未回答。

标签: com c++builder atl


【解决方案1】:

将 COM 对象接口放入 Global Interface Table 并让 GIT 为您处理编组。当任何线程请求 COM 接口时,GIT 会检查调用单元并相应地提供直接指针或合适的代理。您的代码不会知道区别(或关心),只需根据需要正常使用返回的接口即可。

这在 MSDN 上有记录:

Accessing Interfaces Across Apartments

【讨论】:

    猜你喜欢
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多