解读将 Visual C++ 6 项目升级到 Visual Studio 2008 时出现的错误

Posted

技术标签:

【中文标题】解读将 Visual C++ 6 项目升级到 Visual Studio 2008 时出现的错误【英文标题】:Deciphering errors in upgrading a Visual C++ 6 project to Visual Studio 2008 【发布时间】:2009-05-15 19:57:06 【问题描述】:

我想看看能否将这个名为MouseTool 的已失效开源项目与Windows Vista 一起更新。它是一个驻留点击器,可以帮助那些在点击鼠标时感到疼痛的人(比如我自己)。当鼠标停在屏幕上的某个位置时,该软件模拟点击。

几年来似乎没有人接触过这个项目,所以当我在 Visual Studio 2008 中打开它时,我遇到了很多错误。我对 Visual Studio 知之甚少,并希望这些错误能为这里的某个人敲响警钟。有人可以提供有关我如何着手解决其中一些错误的任何提示,我们将不胜感激。

举个例子,这个错误。 . .

Error   18  error C2440: 'static_cast' : 
cannot convert from 'void (__thiscall COptionsSheet::* )(UINT,POINTS)' 
to 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)'   

。 . .对应这一行:

ON_MESSAGE( WM_NCLBUTTONDOWN,   OnNCLDown )

来自这个区块:

BEGIN_MESSAGE_MAP(COptionsSheet, CPropertySheet)
    //AFX_MSG_MAP(COptionsSheet)
    ON_WM_HELPINFO()
    ON_WM_MOUSEMOVE()
    ON_WM_SETCURSOR()
    //AFX_MSG_MAP
    ON_MESSAGE( WM_NCLBUTTONDOWN,   OnNCLDown )
    ON_MESSAGE( WM_NCLBUTTONUP,     OnNCLUp )
    ON_BN_CLICKED(ID_HELP, OnHelpButton)
END_MESSAGE_MAP()

为谁敲钟?

【问题讨论】:

如果您发布一些与某些错误相关的代码会很有帮助。 如果向下滚动,与这些错误相关的所有代码都会在下面列出。你的意思是很难弄清楚哪个错误与哪个代码有关?我认为我应该通过提供这些错误来自的完整源页面来提供整个上下文。也许一个更好的主意是摘录一段代码并显示随之而来的错误。感谢您的建议。 【参考方案1】:

某些 MFC 事件处理程序的成员签名未在 vc6 中正确检查 - 在 VC6 中编译错误的代码需要修复才能在您正在使用的更新编译器中编译。

ON_MESSAGE 目标的处理程序需要符合此签名:

afx_msg LRESULT (CWnd::*)(WPARAM, LPARAM).

你的签名是这样的:

void (COptionsSheet::* )(UINT,POINTS)

CWnd 已经有这个成员了:

afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point);

使用该签名而不是您自己手动滚动的 OnNclDown。

编辑:对 OnNclButtonDown 使用 ON_WM_NCLBUTTONDOWN 而不是 ON_MESSAGE。

【讨论】:

【参考方案2】:

问题在于,在较新版本的 Visual Studio 中,对函数签名的检查更加严格。旧的 MFC 宏代码会让事情不顺利,但它们确实有效。

要修复错误,您需要检查消息映射中的每条消息并更改方法以匹配签名。

编辑: WM_NCLBUTTONDOWN Notification 声明它需要 WPARAMLPARAM,它们被视为 int 和指向 POINTS 结构的指针。因此,如果您将签名更改为使用WPARAM w, LPARAM l 而不是UINT, POINTS,然后将wl 参数cast 转换为类型,应该没问题。

这更多的是让签名和函数真正匹配,而不是改变它们的工作方式。

【讨论】:

好的。因此,例如,对于这个:ON_MESSAGE(WM_NCLBUTTONDOWN, OnNCLDown),我假设您的意思是它需要匹配签名:'LRESULT (__thiscall CWnd::*)(WPARAM,LPARAM)',正如错误消息所述。关于如何具体做到这一点的任何建议?【参考方案3】:

我遇到了同样的问题,但是接收消息的类不是从 CWnd 派生的(从 CWinThread 派生的)。

关于什么宏可以让我收到消息的任何想法?

编辑: 花了我很长时间去挖掘 MSDN 来找到这个,但是对从 CWinThread 派生的类使用 ON_THREAD_MESSAGE() (应该想到这个......)。

【讨论】:

以上是关于解读将 Visual C++ 6 项目升级到 Visual Studio 2008 时出现的错误的主要内容,如果未能解决你的问题,请参考以下文章

如何将 jpg 文件加载到 CBitmap (visual c++ 6.0) 中?

将 C++ 应用程序从 Visual Studio 2010 升级到 2013 时出现链接器错误。

如何将项目从 Visual C++ 6.0 转换为 Visual Studio Express 2010?

将 Visual Studio 升级到 15.5 后缺少 System.Net.Http

将crm 4插件项目从visual studio 2005升级到visual studio 2010

从 Visual C++ 6 迁移到 Visual C++ 2008 express