delphi:通过64位邮寄消息发送课程

问题描述

我想使我的应用程序与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,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;

64位以上的代码兼容吗?

解决方法

您显示的内容可以正常工作,因为LPARAM被定义为LONG_PTR,它是32位和64位系统上指针大小的整数(与WPARAM,其定义为UINT_PTR)。许多标准Win32消息在其WPARAMLPARAM值中带有指针。允许用户定义的消息执行相同的操作(只要它们不跨越过程边界即可)。

如果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,LPARAM(test_data)) then
    test_data.Free; // <-- add this
end;