Здесь смешанные проблемы. CAppModule
— это класс WTL. _pAtlModule
— это статическая/глобальная переменная ATL, указывающая на одноэлементный класс модуля.
Вы не можете решить проблему ATL _pAtlModule
с WTL CAppModule
, потому что они не связаны (хотя и имеют определенное сходство между ними).
Чтобы решить проблему _pAtlModule
, вам нужен экземпляр модуля ATL. Самый простой — добавить CComModule
static:
CComModule _Module; // <-- Here you go
int _tmain(int argc, _TCHAR* argv[])
{
//...
Поскольку сам CComModule
здесь только для обратной совместимости, было бы лучше использовать вместо него CAtlExeModuleT
(и его друзей), однако WTL не будет работать таким образом, потому что CAppModule
WTL наследуется от 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
вызывает цепочку фильтров сообщений, а цикл модального диалога - нет).
person
Roman R.
schedule
26.07.2013