我正在将我的项目从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)
请告知为什么会出现这种错误。
由于
答案 0 :(得分:5)
我建议您查看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?
答案 1 :(得分:1)
WPARAM
在64位Windows中定义为unsigned __int64
,LRESULT
和LPARAM
为__int64
。
您必须相应地更改BrnDefDlgClass
的签名。如果使用WinAPI提供的typedef而不是内置类型,则可以在32位和64位平台上进行编译。