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

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

  • 但是我似乎找不到另一个CAppModule实例化,而是看到一个CAtlExeModuleT实例化(这不是我的代码。)。

    现在,根据我搜索的内容,我还没有找到一种从CAtlExeModuleT对象获取消息循环的方法。他们是不同的东西还是我错过了什么?

    最佳答案

    这里有很多问题。 CAppModule是WTL类。 _pAtlModule是静态/全局ATL变量,它指向模块单例类。

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

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

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

    因为CComModule本身仅是为了向后兼容,所以改用CAtlExeModuleT(和它的 friend )会更好,但是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();
    
    GetMessageLoop调用将检索您之前添加的消息循环。

    解决了这个ATL/WTL问题后,您可以继续到WTL message loop thing,您希望在那里在模态对话框消息循环中调用PreTranslateMessage,并且在那儿不会被调用,因为它不希望以这种方式工作(CMessageLoop调用消息过滤器链,而模式对话框的循环则不行)。

    10-04 12:30