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;
问题原因
- 类型宽度不匹配:代码中存储
Data时使用了bigInt类型,该类型在32位和64位环境下均为4字节宽度;而64位环境下指针宽度为8字节,用bigInt存储指针会导致地址截断,无法完整保存有效内存地址。 - 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
相关产品推荐
相关产品推荐

