C++ 具有多重继承的消息映射MFC:如何避免警告C4407和运行时崩溃
我最近将一个项目从VS2008移植到VS2013,遇到了一些堆栈损坏问题。 经过一些研究,我可以找出以下代码的原因:C++ 具有多重继承的消息映射MFC:如何避免警告C4407和运行时崩溃,c++,visual-c++,mfc,multiple-inheritance,C++,Visual C++,Mfc,Multiple Inheritance,我最近将一个项目从VS2008移植到VS2013,遇到了一些堆栈损坏问题。 经过一些研究,我可以找出以下代码的原因: class CInternalInterface { afx_msg void OnMouseMove(UINT, CPoint) = 0; }; class CMyDlg : public CDialog, public CInternalInterface { afx_msg void OnMouseMove(UINT, CPoint); } BEGIN_MESS
class CInternalInterface
{
afx_msg void OnMouseMove(UINT, CPoint) = 0;
};
class CMyDlg : public CDialog, public CInternalInterface
{
afx_msg void OnMouseMove(UINT, CPoint);
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
编译器在ON_WM_MOUSEMOVE()语句中发出“警告C4407:在指向成员表示的不同指针之间强制转换,编译器可能生成错误代码”,并且在运行时,每当处理WM_MOUSEMOVE消息时,堆栈都会损坏
代码在VS2008中运行良好(没有警告,没有运行时问题),尽管我同意在非CWnd派生接口中定义MFC消息处理程序函数一开始不是一个好主意
现在,我通过为OnMouseMove处理程序使用不同的函数名明确地扩展ON_WM_MOUSEMOVE来解决这个问题
...
class CMyDlg : public CDialog, public CInternalInterface
{
afx_msg void OnCWndMouseMove(UINT, CPoint);
afx_msg void OnMouseMove(UINT, CPoint);
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
{
WM_MOUSEMOVE, 0, 0, 0, AfxSig_vwp,
(AFX_PMSG)(AFX_PMSGW)
(static_cast< void (AFX_MSG_CALL CWnd::*)(UINT, CPoint) >(&CMyDlg::OnCWndMouseMove))
},
END_MESSAGE_MAP()
。。。
CMyDlg类:公共CDialog、公共CInternalInterface
{
afx_msg void OnCWndMouseMove(UINT,CPoint);
afx_msg void OnMouseMove(UINT,CPoint);
}
开始消息映射(CMyDlg、CDialog)
{
WM_MOUSEMOVE,0,0,0,AfxSig_vwp,
(AFX_PMSG)(AFX_PMSGW)
(静态_cast(&CMyDlg::OnCWndMouseMove))
},
结束消息映射()
但是,此解决方案有几个缺点-扩展宏可能会导致与将来的MFC版本不兼容,并且可能会混淆其他开发人员使用不同名称的MFC消息处理程序
所以我有两个问题:
只是另一种方法。这并不能直接解决消息映射的问题 为什么不为这样一个“接口”使用经典子类呢 我使用CSubclassWnd(来自pauldilascia)、CHookWnd(来自pjnouter)或ATL子类化特性 这有助于我将接口附加到现有窗口,并且我可以在特定窗口操作上实现标准功能
使用上面的一个库,您甚至可以为一个窗口创建多个“接口”。我确信在以后的VS版本中,
OnMouseMove
返回一个BOOL
。这可能是问题所在吗?根据统计,与2005-2013年相比,在MouseMove(…)上都有afx\u msg void