错误 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
作为返回类型,并使用WPARAM
和LPARAM
作为参数(就像您的错误消息中的第二个签名一样)。
LRESULT
被定义为LONG_PTR
,并且每当PTR
出现在名称中时,您应该期望它大到足以容纳一个指针。指针在 32 位上是 4 个字节,在 64 位上是 8 个字节,因此如果您为 64 位编译,LRESULT
将不适合long
(即 4 个字节)。
使用WPARAM
和LPARAM
作为参数类型也很重要,因为它们的大小也会因平台而异。有关更多信息,请参阅此问题的答案:What are the definitions for LPARAM and WPARAM?
【讨论】:
【参考方案2】:WPARAM
在 64 位 Windows 中定义为 unsigned __int64
、LRESULT
和 LPARAM
是 __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 错误