无法编译64位CXTipListBox

问题描述 投票:0回答:1

我正在尝试从这里的课程中获取

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

我被难住了。

visual-c++ mfc listbox
1个回答
0
投票

微软于 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 的计时器,那么如何分配一个没有其他人使用的 ID? 全面了解此属性并提供可操作的见解。


1 这对于 32 位版本没有不利影响。

UINT
UINT_PTR
是 32 位架构的 same 类型的别名,因此没有任何变化。

© www.soinside.com 2019 - 2024. All rights reserved.