Ale*_*ruC 2 c++ winapi wtl atl
我试图从我的项目中的ATL :: CAppModule获取消息循环,似乎没有,所以:
extern CAppModule _Module;
在"stdafx.h"
和CAppModule _Module;
我的.cpp文件,汇编,linkes并在执行注册步骤我得到断言atlbase.h
这里
ATLASSERT(_pAtlModule == NULL);
这意味着CAppModule已声明.但我似乎无法找到另一个CAppModule实例,而是看到CAtlExeModuleT实例化(它不是我的代码..).
现在..从我搜索过的内容中我找不到从CAtlExeModuleT对象获取消息循环的方法.他们是不同的东西还是我错过了什么?
这里有各种各样的问题.CAppModule
是一个WTL类._pAtlModule
是指向模块单例类的静态/全局ATL变量.
你无法解决_pAtlModule
WTL的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
调用消息)过滤器链,模态对话框的循环不).