这里有各种各样的问题。CAppModule
是一个 WTL 类。_pAtlModule
是指向模块单例类的静态/全局 ATL 变量。
你不能_pAtlModule
用 WTL 解决 ATL 问题,CAppModule
因为两者是不相关的(尽管它们之间有一定的相似性)。
要解决此_pAtlModule
问题,您需要一个 ATL 模块实例。最简单的就是添加CComModule
静态:
CComModule _Module; // <-- Here you go
int _tmain(int argc, _TCHAR* argv[])
{
//...
因为CComModule
它本身在这里只是为了向后兼容,所以最好使用CAtlExeModuleT
(和朋友)代替,但是 WTL 不会以这种方式工作,因为 WTLCAppModule
继承自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 消息循环,您希望PreTranslateMessage
在模态对话框消息循环中调用它,并且不会在那里调用它,因为它不会以这种方式工作(CMessageLoop
调用 message过滤器链和模态对话框的循环没有)。