CAppModule与CAtlExeModuleT,获取应用程序消息循环

CAppModule vs CAtlExeModuleT , getting the application message loop

本文关键字:应用程序 消息 循环 获取 CAtlExeModuleT CAppModule      更新时间:2023-10-16

我正试图从我的项目中的ATL::CAppModule获取消息循环,但似乎没有,所以:

  • 我已经尝试定义了CAppModule,extern CAppModule _Module;"stdafx.h"中,CAppModule _Module;.cpp文件中,它编译、链接,在执行注册步骤时,我在atlbase.h中得到一个断言ATLASSERT(_pAtlModule == NULL);这意味着CAppModule已经被声明

但我似乎找不到另一个CAppModule实例化,相反,我看到了一个CAtlExeModuleT实例化(这不是我的代码..)

现在。。从我搜索的内容来看,我还没有找到从CAtlExeModueT对象获取消息循环的方法。它们是不同的东西还是我错过了什么?

这里有多种问题。CAppModule是一个WTL类。_pAtlModule是指向模块singleton类的静态/全局ATL变量。

您无法用WTL CAppModule修复ATL _pAtlModule问题,因为两者不相关(尽管两者之间有一定的相似性)。

要修复_pAtlModule问题,您需要一个ATL模块实例。最简单的是添加CComModule static:

CComModule _Module; // <-- Here you go
int _tmain(int argc, _TCHAR* argv[])
{
  //...

因为CComModule本身只是为了向后兼容,所以最好使用CAtlExeModuleT(和朋友),但是WTL不会以这种方式工作,因为WTL的CAppModule继承自CComModuleCAppModule的全局实例也将是ATL CComModule:的实例

CAppModule _Module;
int _tmain(int argc, _TCHAR* argv[])
{
    // ...
    _Module.Init(...
    CMessageLoop MessageLoop;
    _Module.AddMessageLoop(&MessageLoop);
    // ...

然后稍后介绍一些应用程序对象:

CMessageLoop* pMessageLoop = _Module.GetMessageLoop();

CCD_ 18调用将检索您先前添加的消息循环。

解决了这个ATL/WTL问题后,您可以转到WTL消息循环,在那里您希望PreTranslateMessage在模式对话框消息循环上被调用,但它不会在那里被调用,因为它不应该以这种方式工作(CMessageLoop调用消息过滤链,而模式对话框的循环不调用)。