我正在尝试从我的项目中的ATL::CAppModule获取消息循环,似乎没有,所以:
extern CAppModule _Module;
中添加"stdafx.h"
,在.cpp文件中添加CAppModule _Module;
,它进行编译,链接,并在执行注册步骤中在atlbase.h
中获得一个断言ATLASSERT(_pAtlModule == NULL);
这意味着已经声明了CAppModule。 但是我似乎找不到另一个CAppModule实例化,而是看到一个CAtlExeModuleT实例化(这不是我的代码。)。
现在,根据我搜索的内容,我还没有找到一种从CAtlExeModuleT对象获取消息循环的方法。他们是不同的东西还是我错过了什么?
最佳答案
这里有很多问题。 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
(和它的 friend )会更好,但是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
调用消息过滤器链,而模式对话框的循环则不行)。