CAppModule срещу CAtlExeModuleT, получаване на цикъла на съобщенията на приложението

Опитвам се да получа цикъла на съобщенията от ATL::CAppModule в моя проект, изглежда, че няма такъв, така че:

  • Опитах да дефинирам CAppModule, с extern CAppModule _Module; в "stdafx.h" и CAppModule _Module; в моя .cpp файл, той се компилира, свързва и при стъпката за извършване на регистрация получавам твърдение в atlbase.h тук ATLASSERT(_pAtlModule == NULL);, което означава, че CAppModule има вече е обявено.

Но изглежда не мога да намеря друга инстанция на CAppModule, вместо това виждам инстанция на CAtlExeModuleT (това не е моят код..).

сега.. от това, което търсих, не намерих начин да получа цикъла на съобщенията от обект CAtlExeModuleT. Това различни неща ли са или пропускам нещо?


person AlexandruC    schedule 26.07.2013    source източник


Отговори (1)


Тук има смесица от проблеми. 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
comment
CModule няма GetMessageLoop, как трябва да получа цикъла на съобщенията с помощта на CAtlExeModule? Вече направих вашия по-добър подход, как сега да получа цикъла на съобщенията - person AlexandruC; 26.07.2013
comment
Не виждам истинския ви код и не разбирам какво се случва. Картата CMessageLoop е за нишка и не можете да получите екземпляр, който никога не сте добавяли по-рано в същата нишка. - person Roman R.; 26.07.2013
comment
Добре, благодаря ви много и съжалявам за наводнението с коментари, съседе. - person AlexandruC; 26.07.2013