1

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

4

2 回答 2

3

在现代 Delphi 版本中,您的演员表不正确。的第二个参数的Perform类型是WPARAMXE2 中无符号的。因此,如果您要投射,那么您应该投射到WPARAM.

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

但无论如何你都不需要投射。那是因为HDCisUINT_PTR和 so is WPARAM。只需删除演员表:

Control.Parent.Perform(WM_PAINT, DC, 0);

传统上,Windows 类型的定义在 Delphi 中一直是一团糟,许多关键类型定义不正确。当引入 64 位 Delphi 编译器时,Embarcadero 选择了纠正这些错误的时机。

在较旧的 Delphi 版本中,需要强制转换,因为 的第二个参数WPARAM已签名,但未HDC签名。

于 2013-03-28T08:59:33.173 回答
1

是 carfull 类型的整数不是 WParam .. 你需要将 DC 类型转换为 WParam 类型

 Control.Parent.Perform(WM_PAINT, WPARAM(DC), 0);
于 2013-03-28T10:40:35.103 回答