【问题标题】:ATL sample of calling (marshalling) Apartment-threaded COM interfaces from a worker thread从工作线程调用(编组)单元线程 COM 接口的 ATL 示例
【发布时间】:2011-03-24 06:26:52
【问题描述】:

我正在寻找说明在 ATL COM 服务器 DLL 中进行跨线程 COM 调用的代码示例。知道吗?

更多细节:

我的组件是一个 IE 浏览器帮助对象,它需要在后台线程上工作。在从 IE 的主线程调用的对象方法之一中,IE 给了我一个指向 IE DOM (IHtmlWindow2) 的指针,我将它存储在本地成员变量中。

现在我想创建一个工作线程,它可以异步调用我刚刚存储的那个 COM 接口指针上的方法。

如果重要的话,我的调用将在我从从 IE 获取接口指针的方法返回后发生,因此当我尝试从我的工作线程进行调用时,IE(而不是我的代码)将拥有控制权。

我的组件和宿主应用程序都是单元线程的。

任何人都知道一个很好的 C++ 示例来展示这是如何完成的?

我特意寻找一个简短、直接的示例(只是指向相关文档的指针),因为我阅读了 this question 及其答案并被学习我必须从头开始编写实现。任何时候有人建议在编写代码之前阅读 Don Box 的书,你就知道你会经历一个漫长而混乱的夜晚...... :-)

【问题讨论】:

    标签: com marshalling atl bho apartments


    【解决方案1】:

    这在 COM 中是自动的,它会处理单元要求,并且如果接口指针具有 STA 亲和性,它将编组调用。您必须在线程中使用接口指针之前对其进行编组,ATL 具有 AtlMarshalPtrInProc() 和 AtlUnmarshalPtr() 辅助方法来简化此操作。 CoMarshalInterThreadInterfaceInStream() 或 IGlobalInterfaceTable 如果你想自己做的话。

    【讨论】:

      猜你喜欢
      • 2011-04-05
      • 2018-12-14
      • 2011-08-04
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 2010-12-09
      • 2011-06-10
      相关资源
      最近更新 更多