Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有多重继承的消息映射MFC:如何避免警告C4407和运行时崩溃_C++_Visual C++_Mfc_Multiple Inheritance - Fatal编程技术网

C++ 具有多重继承的消息映射MFC:如何避免警告C4407和运行时崩溃

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

我最近将一个项目从VS2008移植到VS2013,遇到了一些堆栈损坏问题。 经过一些研究,我可以找出以下代码的原因:

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消息处理程序

所以我有两个问题:

  • 这是编译器错误吗?如果CWnd派生的基类是类定义中列出的第一个基类,那么多重继承不应该与MFC一起工作吗?宏显式地将函数强制转换为CWnd::*,因此两个OnMouseMove(…)函数之间应该没有歧义

  • 有没有更好的办法解决这个问题?在CInternalInterface中重命名OnMouseMove()是不可行的,因为它在代码库中大量使用,并且判断何时调用重命名的函数以及何时在各种实现中使用OnMouseMove并非易事


  • 只是另一种方法。这并不能直接解决消息映射的问题

    为什么不为这样一个“接口”使用经典子类呢

    我使用CSubclassWnd(来自pauldilascia)、CHookWnd(来自pjnouter)或ATL子类化特性

    这有助于我将接口附加到现有窗口,并且我可以在特定窗口操作上实现标准功能


    使用上面的一个库,您甚至可以为一个窗口创建多个“接口”。

    我确信在以后的VS版本中,
    OnMouseMove
    返回一个
    BOOL
    。这可能是问题所在吗?根据统计,与2005-2013年相比,在MouseMove(…)上都有
    afx\u msg void