D2007中的德尔福HDC类型声明与DXE2相比

时间:2013-03-28 08:27:07

标签: delphi

在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(我认为是无符号整数)是否安全?

2 个答案:

答案 0 :(得分:3)

在现代Delphi版本中,您的演员表不正确。 Perform的第二个参数输入为WPARAM,其中XE2是无符号的。因此,如果您要进行投射,那么您应该投射到WPARAM

在32位代码中,您的演员将DC的大值重新解释为负值。然后,当您传递给unsigned参数时,范围检查错误随之而来。在64位代码中,您的强制转换将导致指针截断。

但你无论如何都不需要施放。这是因为HDCUINT_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);