在BHO中从静态方法调用网页上的javascript

时间:2010-02-28 12:31:58

标签: javascript multithreading com bho

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

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

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

  2. 我尝试缓存在每个BHO中创建的所有IWebBrowser2指针,稍后从静态方法访问它们。但是,我认为存在一些(联合国)编组问题。这会有用吗?关于这样做的好/不同方法的任何建议?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

使用GlobalInterfaceTable跨线程访问对象。