我正在为Internet Explorer编写一个浏览器帮助程序对象,我需要通过“静态”(或“全局”)回调方法在所有打开的浏览器实例上调用javascript方法。
我遇到的问题我确信与COM中的多线程有关。我的问题是:
每个浏览器都有IWebBrowser2
指向的CComPtr<IWebBrowser2>
对象。如果我的BHO类中有一个静态回调方法,该回调会到达哪个线程?它是由IE创建的BHO线程中的任何一个吗?
我尝试缓存在每个BHO中创建的所有IWebBrowser2
指针,稍后从静态方法访问它们。但是,我认为存在一些(联合国)编组问题。这会有用吗?关于这样做的好/不同方法的任何建议?
答案 0 :(得分:1)
1
的答案取决于您为BHO指定的线程模型。如果您将ThreadingModel
指定为Apartment
,则COM会将对您的对象(在每个iexplore.exe进程中)的所有调用封送到同一个线程。如果您将ThreadingModel
指定为Free
或Both
,则可以在任何主题上访问您的对象。
2
的答案是肯定的,它会起作用。从你喜欢的任何线程调用COM方法通常是安全的,因为每个对象在注册时都会通告它的线程模型,然后COM本身负责处理必须发生的任何编组。
您可能会发现以下指向有关COM线程模型的文章的链接:
答案 1 :(得分:0)
使用GlobalInterfaceTable跨线程访问对象。