c++ - CAppModule vs CAtlExeModuleT ,获取应用程序消息循环

标签 c++ winapi atl wtl

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

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

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

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

最佳答案

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

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

要修复 _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 调用消息过滤器链, 而模态对话框的循环则不会)。

关于c++ - CAppModule vs CAtlExeModuleT ,获取应用程序消息循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17884290/

相关文章:

c++ - 密文不是 block 大小的倍数

java - 跨编程语言的动态内存分配

c++ - 正确设置和使用 zlib

c++ - GetFileAttributes 为无效输入返回 FILE_ATTRIBUTE_DIRECTORY

c++ - 如何使用 COM 从 win32 应用程序处理 Excel 2007 和 Excel 2003(Excel 图表)?

c++ - ATL C++ 内存泄漏与 ccomobjects safearray

c++ - 为什么在 msvc++ 中我们有 _snprintf 而其他编译器允许 snprintf

c++ - 用 C/C++ for windows 开发时省略 msvcr100.dll?

c - 无法在 C 中创建全屏控制台窗口

c++ - 缓存 CAtlList 对象的 POSITION 对象是否安全?