Тук има смесица от проблеми. 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