我正在將 Delphi Windows 程式轉換為 64 位。當我使用 SendMessage 向組件發送 EM_LINEINDEX 訊息時,如果 WPARAM 引數大于組件中的文本行數,它應該回傳 -1。但它回傳 $FFFFFFFF(32 位格式的 -1)。因此與 -1 的比較失敗。
演示很容易,只需構建一個包含 TMemo 和 TButton 的表單的 VCL 應用程式添加以下 buttonclick 代碼:
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 中回傳 00000000FFFFFFF。
如果將變數 x 更改為整數,它可以作業,但如果打開范圍檢查(使用 {$R })它會拋出一個范圍錯誤例外,這就是我最初發現它的方式。
我應該期望 64 位環境中所有 Windows 訊息的 32 位結果嗎?
uj5u.com熱心網友回復:
Edit/RichEdit 控制元件可能在內部使用 32 位長度值。
您可能只需要接受這個怪癖并將回傳值視為 32 位整數。除非您希望在這些控制元件中存盤超過 4gb 的文本,否則這應該不是問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/451202.html
