我试图从我的项目中的ATL :: CAppModule获取消息循环,似乎没有,所以:
extern CAppModule _Module;
中的"stdafx.h"
和 .cpp文件中的CAppModule _Module;
,它会编译,链接和执行注册我在这里atlbase.h
得到一个断言
ATLASSERT(_pAtlModule == NULL);
这意味着已经声明了CAppModule。 但我似乎无法找到另一个CAppModule实例,而是看到CAtlExeModuleT实例化(它不是我的代码..)。
现在..从我搜索的内容中我找不到从CAtlExeModuleT对象获取消息循环的方法。他们是不同的东西还是我错过了什么?
答案 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
继承了来自CComModule
。 CAppModule
的全局实例也将是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
调用消息过滤器链,而模态对话框的循环不这样做。)