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

时间:2013-07-26 14:38:54

标签: c++ winapi atl wtl

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

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

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

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

1 个答案:

答案 0 :(得分:7)

这里有各种各样的问题。 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(和朋友),但是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调用消息过滤器链,而模态对话框的循环不这样做。)