ATL调用(编组)样本来自工作线程的公寓线程COM接口

时间:2011-03-23 21:36:58

标签: com marshalling atl bho apartments

我正在寻找一个代码示例,该示例说明了在ATL COM Server DLL中进行跨线程COM调用。知道吗?

更多详情:

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

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

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

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

任何人都知道一个好的C ++示例,展示了如何做到这一点?

我特意寻找一个简短明了的样本(并且只是指向相关文档的指针),因为我读了this question及其答案,并被吓到了从头开始编写实现需要做的学习量。任何时候有人建议在编写代码之前阅读Don Box书籍,你知道你已经进入了漫长而令人困惑的夜晚......: - )

1 个答案:

答案 0 :(得分:2)

这在COM中是自动的,它负责公寓要求,并且如果接口指针具有STA亲和性,则将封送调用。您必须在线程中使用接口指针之前编组接口指针,ATL具有AtlMarshalPtrInProc()和AtlUnmarshalPtr()辅助方法以使其更容易。 CoMarshalInterThreadInterfaceInStream()或IGlobalInterfaceTable,如果你想自己做。