如何解决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消息在其WPARAM
和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,LPARAM(test_data)) then
test_data.Free; // <-- add this
end;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。