错误 C2440:“static_cast”:无法从“long”转换为“LRESULT”

Posted

技术标签:

【中文标题】错误 C2440:“static_cast”:无法从“long”转换为“LRESULT”【英文标题】:error C2440: 'static_cast' : cannot convert from 'long' to 'LRESULT' 【发布时间】:2012-10-15 07:23:47 【问题描述】:

我正在将我的项目从 32 位版本转换为 64 位版本,在以 64 位编译项目时,出现以下错误。

Error   2   error C2440: 'static_cast' : cannot convert from 'long (__cdecl BrnDefDlgClass::* )(UINT,long)' to 'LRESULT (__cdecl CWnd::* )(WPARAM,LPARAM)'  C:\Program Files (x86)\...\CXX\TEST.CXX 854 1   cfg

这个错误将我指向下面的代码行。

ON_MESSAGE        (WM_USER_AFTERCBNSELCHANGE,   OnAfterCBSelectMsg)

请告知为什么会发生此错误。

谢谢

【问题讨论】:

能把部分代码贴出来 我在上面第二块发布的代码中出现错误 OnAfterCBSelectMsg的签名是什么样子的? 【参考方案1】:

我建议您查看OnAfterCBSelectMsg 的定义并将其修改为使用LRESULT 作为返回类型,并使用WPARAMLPARAM 作为参数(就像您的错误消息中的第二个签名一样)。

LRESULT 被定义为LONG_PTR,并且每当PTR 出现在名称中时,您应该期望它大到足以容纳一个指针。指针在 32 位上是 4 个字节,在 64 位上是 8 个字节,因此如果您为 64 位编译,LRESULT 将不适合long(即 4 个字节)。

使用WPARAMLPARAM 作为参数类型也很重要,因为它们的大小也会因平台而异。有关更多信息,请参阅此问题的答案:What are the definitions for LPARAM and WPARAM?

【讨论】:

【参考方案2】:

WPARAM 在 64 位 Windows 中定义为 unsigned __int64LRESULTLPARAM__int64

您必须相应地更改BrnDefDlgClass 的签名。如果使用 WinAPI 提供的 typedef 而不是内置类型,则它可以在 32 位和 64 位平台上编译。

【讨论】:

以上是关于错误 C2440:“static_cast”:无法从“long”转换为“LRESULT”的主要内容,如果未能解决你的问题,请参考以下文章

错误 C2440:“static_cast”:无法从“void (__thiscall Visualizza::*)(char [])”转换为“AFX_PMSG”

error C2440: “static_cast”: 无法从“void (__thiscall CMainFrame::* )

VS 2010 中的 C++ 中的 static_cast 无法从 void* 转换为 size_t 错误

如何使用 MFC 工具提示的示例代码修复错误?

错误 C2440:“=”:无法从“const char *”转换为“char *”

由于从 C 到 C++ 的类型转换,无法编译并出现错误 C2440