3

我试图从我的项目中的 ATL::CAppModule 获取消息循环,似乎没有,所以:

  • 我已经尝试在我的 .cpp 文件中定义 CAppModule,extern CAppModule _Module;它会编译"stdafx.h"、链接并在执行注册步骤中我在这里 得到一个断言, 这意味着 CAppModule 已经被声明。CAppModule _Module;atlbase.hATLASSERT(_pAtlModule == NULL);

但我似乎找不到另一个 CAppModule 实例化,而是看到一个 CAtlExeModuleT 实例化(它不是我的代码..)。

现在..根据我的搜索,我还没有找到从 CAtlExeModuleT 对象获取消息循环的方法。它们是不同的东西还是我错过了什么?

4

1 回答 1

8

这里有各种各样的问题。CAppModule是一个 WTL 类。_pAtlModule是指向模块单例类的静态/全局 ATL 变量。

你不能_pAtlModule用 WTL 解决 ATL 问题,CAppModule因为两者是不相关的(尽管它们之间有一定的相似性)。

要解决此_pAtlModule问题,您需要一个 ATL 模块实例。最简单的就是添加CComModule静态:

CComModule _Module; // <-- Here you go

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

因为CComModule它本身在这里只是为了向后兼容,所以最好使用CAtlExeModuleT(和朋友)代替,但是 WTL 不会以这种方式工作,因为 WTLCAppModule继承自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调用 message过滤器链和模态对话框的循环没有)。

于 2013-07-26T14:52:53.033 回答