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

Ale*_*ruC 2 c++ winapi wtl atl

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

  • 我试着定义CAppModule,用extern CAppModule _Module;"stdafx.h"CAppModule _Module;我的.cpp文件,汇编,linkes并在执行注册步骤我得到断言atlbase.h这里 ATLASSERT(_pAtlModule == NULL); 这意味着CAppModule已声明.

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

现在..从我搜索过的内容中我找不到从CAtlExeModuleT对象获取消息循环的方法.他们是不同的东西还是我错过了什么?

Rom*_* R. 7

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

你无法解决_pAtlModuleWTL的ATL 问题,CAppModule因为这两者是无关的(虽然它们之间有一定的相似性).

要解决此_pAtlModule问题,您需要一个ATL模块实例.最简单的是添加CComModule静态:

CComModule _Module; // <-- Here you go

int _tmain(int argc, _TCHAR* argv[])
{
  //...
Run Code Online (Sandbox Code Playgroud)

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

CAppModule _Module;

int _tmain(int argc, _TCHAR* argv[])
{
    // ...
    _Module.Init(...
    CMessageLoop MessageLoop;
    _Module.AddMessageLoop(&MessageLoop);
    // ...
Run Code Online (Sandbox Code Playgroud)

然后在一些应用程序对象上:

CMessageLoop* pMessageLoop = _Module.GetMessageLoop();
Run Code Online (Sandbox Code Playgroud)

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

解决了这个ATL/WTL问题后,你可以转到WTL消息循环的东西,你希望PreTranslateMessage在模态对话框消息循环中调用它,它不会在那里被调用,因为它不会以这种方式工作(CMessageLoop调用消息)过滤器链,模态对话框的循环不).