错误C2440:' static_cast' :无法转换为' long'到了' LRESULT'

时间:2012-10-15 07:23:48

标签: visual-c++

我正在将我的项目从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)
请告知为什么会出现这种错误。

由于

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

WPARAM在64位Windows中定义为unsigned __int64LRESULTLPARAM__int64

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