我正在做一个BHO(IE的扩展),它接收其他线程上的事件。当我从其他线程访问DOM时,IE崩溃了。是否可以从与主BHO线程相同的线程访问DOM,以便它不会崩溃?
这似乎是一个一般的COM多线程问题,我不太了解。
答案 0 :(得分:3)
使用CoMarshalInterface或CoMarshalInterThreadInterfaceInStream
进行研究这些将为您提供一个线程安全的STA COM对象的包装接口。
答案 1 :(得分:1)
我对IE扩展知之甚少,但听起来有些COM对象需要标记为单线程单元,因此COM运行时系统确保它在最初调用它的同一线程上运行。如果您无法更改其他对象,则可以通过标记为STA的单独COM对象将调用路由到DOM,以实现相同的效果。希望这有帮助......我对COM多线程有一点了解,但对IE扩展并不多。
答案 2 :(得分:0)
啊,有趣的多线程有趣的COM。
如果你想将接口指针从一个线程转移到另一个线程一次,Gerald's answer看起来正确。我发现GIT(全局接口表)对于这种事情是一个很大的帮助,如果你在一个多线程系统...基本上你不保留接口指针,而是GIT使用的DWORD cookie为你正在使用它的任何线程获取一个适当封送的接口指针。 (你必须先用GIT注册有问题的对象,然后在完成或你的对象完成后取消注册它)
答案 3 :(得分:0)
但要小心。性能可能会成为一个严重的问题。
如果您只是在玩游戏来了解BHO,您可以使用STA使您的:: SetSite()实现对象像单线程一样运行(这允许您让其他线程将您的BHO指针拉出作为@JasonS提到的GlobalInterfaceTable。
如果您正在做一些预期会成为产品一部分的事情,我强烈建议您仔细考虑在任何地方使用MTA,并自己处理并发和线程安全问题。在这种情况下,您只需要确保与BHO COM对象交互的线程本身已为COM初始化。
例如,如果你想监视网站的传入/传出数据寻找事物(危险或敏感) - 那么你不想强迫所有这些线程在STA对象的喉咙,因为,使用雅虎作为例如,超过30个请求将启动,您的BHO将开始锁定IE。