在Delphi 2007和Delphi XE2中声明HDC类型(设备上下文句柄)的方式是否存在差异。
在D2007中,以下代码工作正常,但在DXE2中产生范围检查错误:
Control.Parent.Perform(WM_PAINT, Integer(DC), 0);
当单步执行D2007中的代码时,DC(设备上下文)的值似乎总是小于MaxInt,但在DXE2中,DC的值通常大于MaxInt。
为什么在同一台机器(相同的项目,相同的代码,相同的操作系统)上运行时,D2007和DXE2中的DC值是不同的?
将DC转换为WParam(我认为是无符号整数)是否安全?
答案 0 :(得分:3)
在现代Delphi版本中,您的演员表不正确。 Perform
的第二个参数输入为WPARAM
,其中XE2是无符号的。因此,如果您要进行投射,那么您应该投射到WPARAM
。
在32位代码中,您的演员将DC
的大值重新解释为负值。然后,当您传递给unsigned参数时,范围检查错误随之而来。在64位代码中,您的强制转换将导致指针截断。
但你无论如何都不需要施放。这是因为HDC
是UINT_PTR
,因此是WPARAM
。只需删除演员:
Control.Parent.Perform(WM_PAINT, DC, 0);
传统上,Windows类型的定义在Delphi中是一个混乱,其中许多键类型定义不正确。当引入64位Delphi编译器时,Embarcadero选择了那个时刻来纠正这些错误。
在较旧的Delphi版本中,需要强制转换,因为WPARAM
的第二个参数已签名,但HDC
未签名。
答案 1 :(得分:1)
小心类型整数不是WParam .. 您需要将DC类型转换为WParam类型
Control.Parent.Perform(WM_PAINT, WPARAM(DC), 0);