2010-02-28 88 views
1

我正在为Internet Explorer编写一个浏览器帮助对象,并且我需要从静态(或全局)回调方法调用所有打开的浏览器实例上的javascript方法。从BHO的静态方法在网页上调用JavaScript

我遇到了我确定与COM中的多线程相关的问题。我的问题是:

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

  2. 我试着缓存所有在每个BHO中创建的IWebBrowser2指针,并在以后从静态方法中访问它们。不过,我认为还有一些(不)涉及编组问题。这会工作吗?对此有何建议?

回答

1

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

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

您可能会发现下面的链接到有关COM线程模型感兴趣的文章:

0

使用GlobalInterfaceTable跨线程访问的对象。