【问题标题】:blocking in STA COM objectSTA COM 对象中的阻塞
【发布时间】:2011-04-13 22:58:51
【问题描述】:

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

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

Source

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

【问题讨论】:

    标签: javascript internet-explorer winapi com activex


    【解决方案1】:

    您需要允许 STA 线程泵送消息,否则,无法将调用分派到 STA 线程:由于单元中已经有一个线程(而且它是单线程的,呵呵)没有其他线程可以进入单元,因此,将消息发布到线程(隐藏)窗口是与 STA 线程通信的“唯一”方式。

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

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

    【讨论】:

      【解决方案2】:

      您没有手动泵送任何东西。尝试在论坛的 sn-p 中使用 CoWaitForMultipleHandles 而不是 MsgWaitForMultipleObjects,并让 COM 仅泵送线程间调用消息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-01
        • 1970-01-01
        • 2015-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多