gpt4 book ai didi

Delphi XE4,TControl.Perform() 的 wParam 只接受无符号整数?

转载 作者:行者123 更新时间:2023-12-03 19:07:04 27 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How should I pass negative values to SendMessage and Perform when they expect a NativeUInt?

(1 个回答)


5年前关闭。




在 Delphi7 中,TControl.Perform()接受 wParam 的负值参数,这就是它应该做的,例如,EM_LINEFROMCHAR winapi 消息预计 -1对于 wParam .

但在 Delphi XE4 下,wParam 的数据类型已更改为 NativeUInt ,它不接受负整数。

这是 Delphi RTL 的错误,还是我理解错误?谢谢。

最佳答案

这是 Delphi 7 header 翻译中的一个缺陷,也是众多缺陷之一。此类型为 documented on MSDN像这样:

WPARAM

A message parameter. This type is declared in WinDef.h as follows:

typedef UINT_PTR WPARAM;


反过来, UINT_PTR是无符号整数类型,其大小与平台指针相同。

大约在引入 64 位编译器的时候,这个缺陷得到了纠正,并且该类型的 Delphi 声明变为无符号,以匹配底层平台 API。

如果你想传递一个负值,你应该强制转换它。像这样:
WPARAM(-1)

这样的 Actor 阵容是 SendMessage 的一个必要的邪恶原因。为所有消息类型提供通用接口(interface)的 API。有时您只需要使您的消息有效负载适合可用的类型。我还要评论 lParam参数的类型为 LPARAM 这是一个指针大小的有符号整数。这意味着当决定如何将附加数据与消息一起传递时,您可以在有符号 ( lParam ) 和无符号 ( wParam ) 类型之间进行选择。当然,如果要传递两个有符号值或两个无符号值,则需要进行强制转换。

EM_LINEFROMCHAR 的情况下你可能会注意到 lParam未使用。你可能会问为什么设计者没有通过签名 lParam 中的字符索引。参数而不是无符号的 wParam争论。一个可能的原因是 -1是一个哨兵值。通过使用无符号参数,字符索引可以是 0 之间的任何值和 $ffffffff - 1 (假设 32 位整数)。这意味着字符索引的有效范围是使用有符号值的两倍。现在,如果使用带符号的值,它可以再次转换为大于 $7fffffff 的值。但是只需要对特殊的哨兵值进行强制转换是有意义的。

关于Delphi XE4,TControl.Perform() 的 wParam 只接受无符号整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37721702/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com