代码之家  ›  专栏  ›  技术社区  ›  Rob

ATL COM对象是否有消息泵?

  •  3
  • Rob  · 技术社区  · 15 年前

    如果您创建一个新的ATL项目,并向它添加一个使用公寓线程模型的简单COM对象(注意:对象而不是控件),那么会有一个消息泵在引擎盖下运行吗?我想创建一个隐藏窗口,它是我的COM对象类的一个成员,但我不确定是否有任何消息会实际传递给它。这是在幕后处理的,还是实际创建COM对象的应用程序类型有关系?

    2 回复  |  直到 15 年前
        1
  •  4
  •   JaredPar    15 年前

    不,默认情况下,ATL COM对象不实现消息泵。您的代码必须通过正常的窗口化库或显式消息泵实现显式地使用on。

        2
  •  0
  •   iantr    15 年前

    如果你的COM对象生活在一个设备中,那么在必要的时候,COM会在引擎盖下使用一个消息泵来与你的COM对象通信。这就是当被另一个应用程序(sta或mta)中的对象调用时,如何安全地对对象调用方法(通过消息队列序列化)。

    你无法在信息泵-com上找到它,只有在它需要的时候才会把它放在一起。调试时,您会注意到您直接在对象上调用方法——您不会跳过消息泵。当然,如果你将生活在不同设备中的多个对象组合在一起,你会是。

    如果需要一个窗口,可以使用标准方法创建一个窗口。ATL提供了简单的Windows类,如cWindow和cWindowWimpl,可以使这变得更容易。