【问题标题】:Does an ATL COM Object Have a Message Pump?ATL COM 对象有消息泵吗?
【发布时间】:2010-12-11 09:30:39
【问题描述】:

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

【问题讨论】:

  • 单线程单元在某处创建一个(作为实现细节),多线程单元将同步工作留给您。

标签: c++ com atl


【解决方案1】:

不,ATL COM 对象默认不实现消息泵。您的代码必须通过普通的窗口库或显式消息泵实现显式使用。

【讨论】:

  • 谢谢。我认为如果不了解更多关于 ATL(和 COM)内部的信息,实现一个会很困难。
  • @Rob,你不需要在这里了解 ATL 或 COM 内部。一个标准的 Win32 消息泵就可以了。
  • 但是这个消息泵的代码将驻留在哪里? DLLMain?
  • @Rob,这取决于您的代码是如何创建的。创建 STA 对象的线程需要创建消息泵,以便该对象正常运行
【解决方案2】:

如果您的 COM 对象位于公寓中,COM 在必要时使用后台消息泵与您的 COM 对象进行通信。这就是在由另一个应用程序(STA 或 MTA)中的对象调用时,在您的对象上安全调用方法的方式(通过由消息队列序列化)。

您无法使用消息泵 - COM 仅在需要时将其组合在一起。您会注意到在调试时直接调用对象上的方法 - 您没有跳过消息泵。当然,如果您将居住在不同公寓中的多个对象放在一起,您会是这样。

如果您需要一个窗口,您可以使用标准方法创建一个。 ATL 提供了简单的 windows 类,例如 CWindow 和 CWindowImpl,这可以使这更容易。

【讨论】:

    猜你喜欢
    • 2016-03-29
    • 2018-03-29
    • 2014-07-20
    • 2016-08-12
    • 2013-09-19
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    相关资源
    最近更新 更多