CAppModule vs 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