You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 11.2 64位下SMDBFltr触发AV异常问题求助及解决

Delphi 11.2 64位下SMDBFltr组件访问违规(AV)问题排查与解决

问题现象

Old Scalabium Software的SMDBFltr组件在Delphi 11.2 64位应用中触发访问违规(AV),但32位应用运行正常。该代码在Delphi 10.4的32位和64位环境下均能稳定运行,调试定位到TSMDBFilterDialog.GetCurrentFilter方法的标记行触发异常:

function TSMDBFilterDialog.GetCurrentFilter: string;
var
  i: Integer;
begin
  Result := '';
  if not Assigned(frmFilterDialog) then
    Exit;
  for i := 0 to frmFilterDialog.lbFilter.Items.Count-1 do
    Result := Result + PAnsiString(frmFilterDialog.lbFilter.Items[i].Data)^;  {<<-- 此处触发AV}
  if (Result <> '') then
    Result := ' AND ' + Result;

  if (Result <> '') then
    Result := Copy(Result, 6, Length(Result)-5);
end;

问题原因

  1. 类型宽度不匹配:代码中存储Data时使用了bigInt类型,该类型在32位和64位环境下均为4字节宽度;而64位环境下指针宽度为8字节,用bigInt存储指针会导致地址截断,无法完整保存有效内存地址。
  2. ASLR机制影响:Delphi 11.2默认启用了地址空间布局随机化(ASLR),随机化后的内存地址被截断后,会指向完全无效的内存区域,直接触发访问违规;而Delphi 10.4可能未强制启用ASLR,或环境差异导致截断后的地址碰巧仍指向有效区域,因此未暴露问题。

解决方案

将代码中用于存储指针的bigInt类型替换为NativeInt类型——NativeInt会根据当前平台自动匹配宽度(32位下4字节,64位下8字节),能够完整保存指针地址,配合ASLR机制正常工作。

致谢

感谢AmigoJack、Brian指出ASLR相关问题,以及Scalabium的Mike Shkolnik提供技术支持,最终通过类型替换解决了问题。

内容的提问来源于stack exchange,提问作者FAlvarado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:20:29