在 64 位环境中调用 SendMessage returns 32 位结果

Calling SendMessage returns 32 bit result in a 64 bit environment

我正在将 Delphi Windows 程序转换为 64 位。当我使用 SendMessage 向组件发送 EM_LINEINDEX 消息时,如果 WPARAM 参数大于组件中的文本行数,它应该 return -1。 但它 returns $FFFFFFFF(32 位格式为 -1)。因此与 -1 的比较失败。

演示很容易,只需构建一个包含 TMemo 和 TButton 的窗体的 VCL 应用程序 添加以下按钮点击代码:

procedure TForm1.Button1Click(Sender: TObject);
var  x: int64;
begin
   x:=SendMessage(Memo1.Handle, EM_LINEINDEX, WPARAM(5), 0);
   ShowMessage(Format('%d  %X',[x,x]));
end;

显示的字符串是:4294967295 FFFFFFFF

单步执行汇编代码,我在 rax 中看到了 returns 00000000FFFFFFF。

如果将变量 x 更改为整数,它会起作用,但如果打开范围检查(使用 {$R+}),它会抛出一个范围错误异常,这就是我最初发现它的方式。

我是否应该期望 64 位环境中所有 Windows 消息的 32 位结果?

Edit/RichEdit 控件可能在内部使用 32 位长度值。

您可能只需要接受这个怪癖并将 return 值视为 32 位整数。这应该不是问题,除非您希望在这些控件中存储超过 4gb 的文本。