我要写一个有这个缺陷的控件。为什么这很糟糕?
您的ActiveX控件有一个共同点 单线程公寓的缺陷 (STA)ActiveX& COM对象必须 避免:STA COM对象无法执行 阻止STA线程上的操作, 除非COM对象也泵 Windows消息。因此,如果你的 控件需要执行同步 阻止操作,它需要 实现Windows消息泵时 等待阻塞操作 完整。
我不想在阻止时抽取消息,因为这似乎导致我的javascript以可重入的方式执行。这真的很糟糕。
答案 0 :(得分:3)
你需要允许STA线程泵送消息,否则,调用不能被分派到STA线程:由于公寓中已经有一个线程(并且它是单线程的,duh)没有其他线程可以进入公寓,因此,向线程(隐藏)窗口发布消息是与STA线程通信的“唯一”方式。
这用于处理ORPC请求,但也用于处理不一定与COM相关的消息(即GUI消息)。通过发出阻塞调用来中断消息处理会破坏ORPC功能,并可能阻止用户界面。
有关COM的详细信息,请参阅Don Box“Essential COM”。
答案 1 :(得分:1)
您手动没有任何泵。尝试在论坛的代码段中使用CoWaitForMultipleHandles
代替MsgWaitForMultipleObjects
,并让COM仅在线程间调用消息。