我试图从我项目中的 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
继承自 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
调用消息过滤器链, 而模态对话框的循环则不会)。
关于c++ - CAppModule vs CAtlExeModuleT ,获取应用程序消息循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17884290/