3

我正在将我的项目从 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)

请咨询为什么会发生此错误。

谢谢

4

2 回答 2

7

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

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

使用WPARAMLPARAM作为参数类型也很重要,因为它们的大小也会根据平台而变化。有关更多信息,请参阅此问题的答案: LPARAM 和 WPARAM 的定义是什么?

于 2012-10-15T08:14:56.433 回答
2

WPARAM定义为unsigned __int64LRESULT并且LPARAM__int6464 位 Windows 中。

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

于 2012-10-15T08:15:36.510 回答