【问题标题】:CAppModule vs CAtlExeModuleT , getting the application message loopCAppModule vs CAtlExeModuleT ,获取应用程序消息循环
【发布时间】:2013-07-26 21:31:27
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ winapi atl wtl


    【解决方案1】:

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

    你不能用 WTL CAppModule 解决 ATL _pAtlModule 问题,因为两者是不相关的(尽管它们之间有一定的相似性)。

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

    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();
    

    GetMessageLoop 调用将检索您之前添加的消息循环。

    解决了此 ATL/WTL 问题后,您可以转到 WTL message loop thing,您希望在模态对话框消息循环中调用 PreTranslateMessage,并且不会在那里调用它,因为它预计不会工作这样(CMessageLoop 调用消息过滤器链,而模态对话框的循环不会)。

    【讨论】:

    • CModule 没有 GetMessageLoop,我应该如何使用 CAtlExeModule 获取消息循环?我已经完成了你的“更好”的方法,我现在如何获得消息循环
    • 我没有看到你的真实代码,我不明白这是怎么回事。 CMessageLoop 映射是每个线程的,您无法在同一线程上获取之前从未添加的实例。
    • 好的,非常感谢,很抱歉让 cmets 泛滥,邻居。
    猜你喜欢
    • 1970-01-01
    • 2013-08-13
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-02
    相关资源
    最近更新 更多