首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成无效的mfc消息映射

生成无效的mfc消息映射
EN

Stack Overflow用户
提问于 2013-03-05 09:26:57
回答 1查看 648关注 0票数 1

我在MFC中有一个简单的测试应用程序,但是它不起作用。消息处理程序根本不被调用。窗口接收消息,但不调用在消息映射中注册的处理程序。

它是一个标准的mfc单对话框应用程序,有一个巨大的按钮块,并在推送它们时对库进行各种调用。但它不调用处理程序。

我追踪到了消息地图似乎被破坏了。有这样的标准声明:

代码语言:javascript
复制
BEGIN_MESSAGE_MAP(CommLib_test_x86Dlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDCANCEL, &CommLib_test_x86Dlg::OnBnClickedCancel)
    ON_BN_CLICKED(IDOK, &CommLib_test_x86Dlg::OnBnClickedOk)
    ON_BN_CLICKED(IDC_BUTTON1, &CommLib_test_x86Dlg::OnBnClickedButton1)
    ON_BN_CLICKED(IDC_BUTTON2, &CommLib_test_x86Dlg::OnBnClickedButton2)
    ON_BN_CLICKED(IDC_BUTTON3, &CommLib_test_x86Dlg::OnBnClickedButton3)
    ON_BN_CLICKED(IDC_BUTTON4, &CommLib_test_x86Dlg::OnBnClickedButton4)
    ON_BN_CLICKED(IDC_BUTTON5, &CommLib_test_x86Dlg::OnBnClickedButton5)
    // many more buttons, but I commented the rest out for test
END_MESSAGE_MAP()

如果我在第一个ON_WM_* (即GetThisMessageMap静态方法)上放置一个断点,并查看消息映射的内容,那么第一个条目是正确的,但其余条目大多为0,数组大小与实际定义不一致。调试器将值报告为

代码语言:javascript
复制
[0] {nMessage=274 nCode=0 nID=0 ...}
[1] {nMessage=0 nCode=0 nID=0 ...}
[2] {nMessage=0 nCode=19 nID=4206192 ...}
[3] {nMessage=55 nCode=0 nID=0 ...}
[4] {nMessage=0 nCode=0 nID=0 ...}
[5] {nMessage=0 nCode=0 nID=0 ...}
[6] {nMessage=0 nCode=0 nID=0 ...}
[7] {nMessage=0 nCode=0 nID=0 ...}
[8] {nMessage=0 nCode=0 nID=0 ...}
[9] {nMessage=0 nCode=0 nID=0 ...}
[10] {nMessage=0 nCode=0 nID=0 ...}
[11] {nMessage=0 nCode=0 nID=0 ...}
[12] {nMessage=0 nCode=0 nID=0 ...}
[13] {nMessage=0 nCode=0 nID=0 ...}
[14] {nMessage=0 nCode=0 nID=0 ...}
[15] {nMessage=0 nCode=0 nID=0 ...}

代码编译得很好,没有任何警告或任何东西。

需要注意的是,应用程序是大量项目集合的一部分,并且这些项目共享编译器选项。我们实际上生成了visual项目,但在使用.vsprops文件之前。我已经有一段时间没有使用这个项目了,同时编译器标志也发生了变化,这是可以想象的。

EN

回答 1

Stack Overflow用户

发布于 2013-03-05 11:03:21

好吧,我找到了。编译器标志确实发生了变化。添加了可怕的/vmg标志(我们在其他库中使用它,并在重构期间传播到不正确的项目)。此标志与MFC不兼容,因为它更改了消息映射项的定义。

长话短说:为了节省一些空间,微软决定,指向成员的指针将根据类是使用单个继承、多个继承还是虚拟继承来不同地表示。虽然它在理论上看起来很好,但在实践中却存在以下问题:

  • 指向不完全类型的成员的指针被声明(在C++中是合法的)。

我怀疑它也会在下列情况下引起问题:

  • 需要将指向具有更复杂指针的类成员的指针转换为指向具有更简单指针的基类成员的指针。

文档中没有提到这种情况,但这是很明显的。顺便说一句,这正是MFC所做的。

规范(ISO/IEC 14882-2011)只要求static_cast指向基成员的指针,如果基类不是实际继承的,但是在Microsoft编译器中,即使基类只有线性继承,它也不能工作,但是子类具有多重继承,基是非第一的。嗯,大家都知道编译器已经不合格了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15220152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档