delphi:通过 64 位的 postmessage 发送一个类

dme*_*ier 2 delphi 64-bit postmessage

我想让我的应用程序兼容 64 位。我正在努力处理 PostMessage 和 LPARAM。我通过 PostMessage 发送一个类的实例。我想知道将值test_data转换为 LPARAM 是否正确。

请看一下下面的代码:

// Data to send 
TMyData=class
  Data1: string;
  Data2: byte;
  Data3: TDateTime;
end;

// send
procedure TTestClass1.PostTestData(AData1: string; AData2: byte; AData3: TDateTime);
var
  test_data: TMyData;
begin
  test_data:= TMyData.Create;

  test_data.Data1:= AData1;
  test_data.Data2:= AData2;
  test_data.Data3:= AData3;

  PostMessage(my_handle,WM_MY_MESSAGE,0,LPARAM(test_data));
end;


// receive
procedure TTestClass2.Message_WM_MY_MESSAGE(var Msg: TMessage);
var
  test_data: TMyData;
begin
  test_data := TMyData(Msg.LParam); // is this also compatible with 64 Bit?

  try
    // Do some work
  finally
    test_data.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

上面的代码兼容64位吗?

Rem*_*eau 5

您所展示的内容将工作得很好,正如LPARAM定义的那样LONG_PTR,它是32 位和 64 位系统上的指针大小的整数(与 相同WPARAM,定义为UINT_PTR)。WPARAM许多标准 Win32 消息在其和值中携带指针LPARAM。用户定义的消息也可以执行相同的操作(只要它们不跨越进程边界)。

如果失败,请确保Free您的对象PostMessage(),因为Message_WM_MY_MESSAGE()在这种情况下不会被调用:

procedure TTestClass1.PostTestData(AData1: string; AData2: byte; AData3: TDateTime);
var
  test_data: TMyData;
begin
  test_data := TMyData.Create;

  test_data.Data1 := AData1;
  test_data.Data2 := AData2;
  test_data.Data3 := AData3;

  if not PostMessage(my_handle, WM_MY_MESSAGE, 0, LPARAM(test_data)) then
    test_data.Free; // <-- add this
end;
Run Code Online (Sandbox Code Playgroud)