Visual Studio 2022 MFC项目BEGIN/END_MESSAGE_MAP报错求助
MFC项目编译错误及解决办法
错误列表及对应修复方案
1. Error C1189:使用/MD[d](CRT DLL版本)构建MFC应用程序需要MFC共享DLL版本,请定义_AFXDLL或不使用/MD[d]
这是优先级最高的基础配置问题,会影响后续其他错误的表现,修复步骤:
- 右键项目 → 属性,打开项目配置窗口
- 进入配置属性 → C/C++ → 预处理器,在「预处理器定义」中添加
_AFXDLL - 或切换CRT版本:进入配置属性 → C/C++ → 代码生成,将运行库从
/MD或/MDd改为/MT或/MTd(静态CRT版本)
2. Error E1086:对象的类型限定符与成员函数"CappApp::GetThisMessageMap"不兼容、Error C2662:无法将'this'指针从'const CappApp'转换为'CappApp &'
这类错误源于消息映射生成代码中this指针被错误当作const传递,修复方式:
- 确认
CappApp类正确继承CWinAppEx,且BEGIN_MESSAGE_MAP(CappApp, CWinAppEx)的基类声明无误 - 检查是否在
const成员函数中调用了需要非const对象的MFC消息映射相关方法,需调整函数的const限定,或改用非const对象调用
3. 注释ON_COMMAND行触发C2248错误、注释整个消息映射块触发LNK2001/LNK1120链接错误
- C2248错误:
CWinApp::OnFileNew等是保护成员,不能直接在派生类消息映射中绑定基类保护成员函数。正确做法是:- 在
CappApp类中重写对应方法:class CappApp : public CWinAppEx { public: afx_msg void OnFileNew(); afx_msg void OnFileOpen(); // 其他类声明内容 }; // 实现文件中 void CappApp::OnFileNew() { CWinAppEx::OnFileNew(); // 调用基类实现,可添加自定义逻辑 } void CappApp::OnFileOpen() { CWinAppEx::OnFileOpen(); } - 在消息映射中绑定自己的成员函数:
BEGIN_MESSAGE_MAP(CappApp, CWinAppEx) ON_COMMAND(ID_FILE_NEW, &CappApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, &CappApp::OnFileOpen) END_MESSAGE_MAP()
- 在
- LNK2001/LNK1120错误:MFC应用必须依赖消息映射块关联消息处理逻辑,删除后框架找不到必要的消息映射入口,会出现未定义符号的链接错误。必须保留消息映射块,修复其中的错误而非删除。
内容的提问来源于stack exchange,提问作者Michaelinscarbororough
相关产品推荐
相关产品推荐

