3

我正在做一个在其他线程上接收事件的 BHO(IE 扩展)。当我从其他线程访问 DOM 时,IE 崩溃。是否可以使 DOM 从与主 BHO 线程相同的线程访问,以免崩溃?

这似乎是一个通用的 COM 多线程问题,我不太了解。

4

4 回答 4

3

研究使用CoMarshalInterfaceCoMarshalInterThreadInterfaceInStream

这些将为您提供线程安全的 STA COM 对象的包装接口。

于 2008-10-14T04:27:20.983 回答
1

我不太了解 IE 扩展,但听起来某些 COM 对象需要标记为单线程单元,以便 COM 运行时系统确保它在最初调用它的同一线程上运行。如果您无法更改其他对象,您可能会通过标记为 STA 的单独 COM 对象将您的调用路由到 DOM 以实现相同的效果。希望这会有所帮助...我对 COM 多线程有所了解,但对 IE 扩展了解不多。

于 2008-10-14T04:20:46.333 回答
0

啊,有趣有趣的 COM 多线程。

如果您只想将接口指针从一个线程转移到另一个线程, Gerald 的答案看起来是正确的。我发现如果你在一个多线程系统中,GIT(全局接口表)对这种事情有很大的帮助......基本上你不会保留接口指针,而是 GIT 使用的 DWORD cookie为您正在使用的任何线程获取一个经过适当编组的接口指针。(您必须先在 GIT 中注册有问题的对象,然后在完成或对象完成后取消注册)

于 2008-12-10T19:03:58.367 回答
0

不过要小心。性能可能成为一个严重的问题。

如果您只是想了解 BHO,则可以使用 STA 使 ::SetSite() 实现对象像单线程一样运行(这允许您让其他线程将 BHO 的指针从 GlobalInterfaceTable 中拉出正如@JasonS 提到的。

如果您正在做一些预期会成为产品一部分的事情,我强烈建议您非常仔细地重新考虑尽可能多地使用 MTA,并自己处理并发和线程安全问题。在这种情况下,您只需要确保与 BHO COM 对象互操作的线程本身是为 COM 初始化的。

例如,如果您想监视网站的传入/传出数据以寻找事物(危险或敏感) - 那么您不想强制所有这些线程进入 STA 对象的喉咙,因为以 Yahoo 为例,将启动 30 多个请求,您的 BHO 将开始锁定 IE。

于 2015-03-11T21:01:34.303 回答