我正在尝试从这里的课程中获取
CXTipListBox
:
https://www.codeproject.com/Articles/4438/XTipComboBox-Display-tooltips-for-combobox
将其用于对话框上的
CListBox
控件。
它在 MFC Win32 32 位中编译并运行良好。
但是 64 位不会编译并显示:
7>XTipListBox.cpp
7>D:\My Programs\2022\MeetSchedAssist\Meeting Schedule Assistant\XTipListBox.cpp(38,2): error C2440: 'static_cast': cannot convert from 'void (__cdecl CXTipListBox::* )(UINT)' to 'void (__cdecl CWnd::* )(UINT_PTR)'
7>D:\My Programs\2022\MeetSchedAssist\Meeting Schedule Assistant\XTipListBox.cpp(38,2): message : Cast from base to derived requires dynamic_cast or static_cast
我被难住了。
微软于 2005 年开始为主流 CPU 架构提供 64 位版本的 Windows XP。该库 (XTipComboBox) 于 2003 年发布,这是可以理解的,没有 64 位支持。编译器错误证明了这一点:
cannot convert from 'void (CXTipListBox::* )(UINT)' to 'void (CWnd::* )(UINT_PTR)'
ON_WM_TIMER
宏开始。与所有消息映射条目宏一样,它需要回调的特定签名(在本例中,还需要一个固定名称,OnTimer
)。成员函数指针类型中的类类型之间不匹配是允许的;这是参数的类型导致构建失败。
UINT
是所有架构的 unsigned int
(32 位无符号整数)的类型别名。迁移到 64 位 Windows 时引入的 UINT_PTR
类型仍然是 32 位构建的 unsigned int
的类型别名,但对于 64 位体系结构是 unsigned __int64
的别名。这就是为什么 32 位构建成功而 64 位构建失败的原因。
要解决此问题,需要更新库代码,将
OnTimer
类成员的参数列表从采用 UINT
更改为接受 UINT_PTR
而不是 1。可能需要相应地更新实现以考虑可能更广泛的类型。 64 位 Windows 编程指南 是查找更多相关信息的宝贵资源。
计时器 ID(以及一般 ID)经常是造成混乱的根源。 ID 唯一性的要求很少引起人们的注意。事情从这里开始变得模糊,除非你再提出两个问题:
定时器 ID 在线程的生命周期内必须是唯一的,并且可以采用任何地址的值。后者常常被忽视为一个机会。 一个窗口不能有两个具有相同 ID 的计时器,那么如何分配一个没有其他人使用的 ID? 全面了解此属性并提供可操作的见解。
1 这对于 32 位版本没有不利影响。
UINT
和 UINT_PTR
是 32 位架构的 same 类型的别名,因此没有任何变化。