在STA COM对象中阻塞

时间:2010-09-17 22:14:16

标签: javascript internet-explorer winapi com activex

我要写一个有这个缺陷的控件。为什么这很糟糕?

  

您的ActiveX控件有一个共同点   单线程公寓的缺陷   (STA)ActiveX& COM对象必须   避免:STA COM对象无法执行   阻止STA线程上的操作,   除非COM对象也泵   Windows消息。因此,如果你的   控件需要执行同步   阻止操作,它需要   实现Windows消息泵时   等待阻塞操作   完整。

Source

我不想在阻止时抽取消息,因为这似乎导致我的javascript以可重入的方式执行。这真的很糟糕。

2 个答案:

答案 0 :(得分:3)

你需要允许STA线程泵送消息,否则,调用不能被分派到STA线程:由于公寓中已经有一个线程(并且它是单线程的,duh)没有其他线程可以进入公寓,因此,向线程(隐藏)窗口发布消息是与STA线程通信的“唯一”方式。

这用于处理ORPC请求,但也用于处理不一定与COM相关的消息(即GUI消息)。通过发出阻塞调用来中断消息处理会破坏ORPC功能,并可能阻止用户界面。

有关COM的详细信息,请参阅Don Box“Essential COM”。

答案 1 :(得分:1)

您手动没有任何泵。尝试在论坛的代码段中使用CoWaitForMultipleHandles代替MsgWaitForMultipleObjects,并让COM仅在线程间调用消息。

相关问题