2008-10-14 12 views

回答

3

考虑使用CoMarshalInterfaceCoMarshalInterThreadInterfaceInStream

这些会给你一个包裹界面的STA COM对象,它是线程安全的。

+0

这样做!非常感谢! 因此,在主线程中,调用CoMarshalInterThreadInterfaceInStream,将流指针传递给辅助线程,并在辅助线程上调用CoGetInterfaceAndReleaseStream以获取要调用的对象的* proxy *。 – yuku 2008-10-14 05:36:53

1

我对IE扩展并不了解,但听起来好像某些COM对象需要标记为单线程单元,以便COM运行时系统确保它在最初调用它的同一线程上运行。如果你不能改变另一个对象,你可能可以通过标记为STA的单独COM对象将你的调用路由到DOM,以达到相同的效果。希望这有助于...我对COM多线程知道一些,但对IE扩展没有太多了解。

0

啊,好玩有趣好玩多线程与COM。

Gerald's answer如果您想要将接口指针从一个线程转移到另一个线程,那么它看起来正确一次。我发现如果你在一个多线程系统中,GIT(全局接口表)对于这种类型的东西是一个很大的帮助......基本上你不会保留接口指针,而是GIT使用的DWORD cookie为你正在使用的任何线程获取适当的编组接口指针。 (你必须首先用GIT注册有问题的对象,稍后当你完成或你的对象完成后注销它)

0

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

如果您只是玩弄了解BHO,可以使用STA使您的:: SetSite()实现对象像单线程一样操作(这允许您让其他线程提取BHO的指针作为@JasonS提到的GlobalInterfaceTable之外

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

例如,if您希望监控网站寻找事物(危险或敏感)的传入/传出数据 - 那么您不希望强制所有这些线程落在STA对象的喉咙,因为以雅虎为例,超过30个请求将启动,您的BHO将开始锁定IE。