Я пытаюсь получить цикл сообщений из ATL :: CAppModule в моем проекте, похоже, его нет, поэтому:
extern CAppModule _Module;
в "stdafx.h"
а также CAppModule _Module;
в моем .файл cpp, он компилирует, связывает и на этапе выполнения регистрации я получаю утверждение в atlbase.h
ВотATLASSERT(_pAtlModule == NULL);
Но я не могу найти другой экземпляр CAppModule, вместо этого я вижу экземпляр CAtlExeModuleT (это не мой код ..).
сейчас .. из того, что я искал, я не нашел способа получить цикл сообщений из объекта CAtlExeModuleT. Это разные вещи или я что-то упустил?
Здесь есть множество проблем. 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
вызывает цепочку фильтров сообщений, а цикл модального диалога — нет).
Других решений пока нет …