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

Я пытаюсь получить цикл сообщений из ATL :: CAppModule в моем проекте, похоже, его нет, поэтому:

  • Я попытался определить CAppModule, с extern CAppModule _Module; в "stdafx.h" а также CAppModule _Module; в моем .файл cpp, он компилирует, связывает и на этапе выполнения регистрации я получаю утверждение в atlbase.h Вот
    ATLASSERT(_pAtlModule == NULL);
    Это означает, что CAppModule уже был объявлен.

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

сейчас .. из того, что я искал, я не нашел способа получить цикл сообщений из объекта CAtlExeModuleT. Это разные вещи или я что-то упустил?

2

Решение

Здесь есть множество проблем. CAppModule это класс WTL. _pAtlModule является статической / глобальной переменной ATL, указывающей на класс синглтона модуля.

Вы не можете исправить ATL _pAtlModule проблема с WTL CAppModule потому что эти два не связаны (хотя и имеют определенное сходство).

Чтобы исправить _pAtlModule Проблема в том, что вам нужен экземпляр модуля ATL. Самое простое — это добавить CComModule статическая:

CComModule _Module; // <-- Here you go

int _tmain(int argc, _TCHAR* argv[])
{
//...

Так как CComModule сам по себе здесь только для обратной совместимости, было бы лучше использовать CAtlExeModuleT (и друзья), однако, WTL не будет работать таким образом, потому что WTL CAppModule наследуется от CComModule, Глобальный экземпляр CAppModule также будет экземпляр для ATL CComModule:

CAppModule _Module;

int _tmain(int argc, _TCHAR* argv[])
{
// ...
_Module.Init(...
CMessageLoop MessageLoop;
_Module.AddMessageLoop(&MessageLoop);
// ...

а затем на некотором объекте приложения:

CMessageLoop* pMessageLoop = _Module.GetMessageLoop();

GetMessageLoop call извлечет цикл сообщений, который вы добавили ранее.

Решив эту проблему ATL / WTL, вы можете перейти к WTL сообщение цикл вещь, где вы ожидаете PreTranslateMessage вызываться в модальном диалоговом цикле сообщений, и он не будет вызываться там, потому что он не должен работать таким образом (CMessageLoop вызывает цепочку фильтров сообщений, а цикл модального диалога — нет).

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]