1

我正在为 Internet Explorer 编写浏览器助手对象,我需要从“静态”(或“全局”)回调方法对所有打开的浏览器实例调用 javascript 方法。

我遇到的问题肯定与 COM 中的多线程有关。我的问题是:

  1. 每个浏览器都会有自己的IWebBrowser2对象指向CComPtr<IWebBrowser2>. 如果我的 BHO 类中有一个静态回调方法,该回调将到达哪个线程?它会是 IE 创建的任何 BHO 线程吗?

  2. 我试图缓存IWebBrowser2在每个 BHO 中创建的所有指针,然后从静态方法中访问它们。但是,我认为涉及到一些(非)编组问题。这行得通吗?关于这样做的好/不同方法的任何建议?

4

2 回答 2

1

答案1取决于您为 BHO 指定的线程模型。如果您指定ThreadingModelApartment,COM 将对您的对象(在每个 iexplore.exe 进程内)的所有调用编组到同一线程。如果指定ThreadingModelFreeBoth,则可以在任何线程上访问您的对象。

答案2是肯定的,它会起作用。从您喜欢的任何线程调用 COM 方法通常是安全的,因为每个对象在注册时都会公布其线程模型,然后 COM 本身负责处理必须发生的任何编组。

您可能会发现以下有关 COM 线程模型的文章的链接很有趣:

于 2010-02-28T14:36:15.740 回答
0

使用 GlobalInterfaceTable 跨线程访问对象。

于 2010-03-04T00:05:49.500 回答