微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

delphi – 在Win64上对旧的Contnrs.TObjectList进行排序[复制]

参见英文答案 > Why cannot take address to a nested local function in 64 bit Delphi?                                    1个
我们有一些使用Contnrs.TObjectList的旧类,在某些情况下,自定义比较函数用于对这些列表进行排序,使用如下所示:

procedure TMyClass.sortItems;

  function CompareFunction(Item1,Item2: Pointer): Integer;
  begin
    Result := TSomeItem(Item1).Value - TSomeItem(Item2).Value;
  end;

begin
  Sort(@CompareFunction);
end;

在为Win32编译时,此代码没有问题,但是当我们为Win64编译它时,我们发现排序不再起作用.

我已经使用Generics.Collections.TObjectList< T>修复了其中一些.相反,并修改CompareFunction及其调用方式.所以我的猜测是它与调用CompareFunction的方式有关,方法是在它前面添加@运算符,据我所知,它指的是函数的地址.

为什么上面的代码不适用于Win64,以及解决它的正确方法是什么?

解决方法

TObjectList.sort()期望其回调的独立函数.

内部函数共享其父函数的堆栈帧(因此它可以访问父项的局部变量和参数).所以你不能使用内部函数作为回调.由于功能如何在32位工作,你在32位中侥幸成功.但这不再适用于64位.

你需要自己移动CompareFunction(),例如:

function CompareFunction(Item1,Item2: Pointer): Integer;
begin
  Result := TSomeItem(Item1).Value - TSomeItem(Item2).Value;
end; 

procedure TMyClass.sortItems;
begin
  Sort(@CompareFunction);
end;

这将适用于32位和64位.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐