Delphi 11.3 Alexandria 64位下Cromis.DirectoryWatch访问违规问题
Cromis.DirectoryWatch在Delphi 11.3 64位下重命名文件夹触发Access Violation的修复
问题描述
- 该单元在Delphi 10 Seattle 32/64位、Delphi 11.3 32位环境下正常运行
- Delphi 11.3 64位环境中捕获文件夹重命名操作时触发Access Violation
- 错误发生在第253行代码:
PWord(Cardinal(NotifyRecord.AMsg) + NotifyData^.FileNameLength)^ := 0; - 错误提示:
Access violation at address 0000000000F6E5C8 in module 'ABCD64BIT.exe'. Write of address 00000000B0D61FDA
问题原因
代码中使用Cardinal类型转换指针NotifyRecord.AMsg,但Cardinal是32位无符号整数类型。在64位Delphi环境中,指针是64位宽度,强制转换为Cardinal会截断地址的高32位,导致计算后的内存地址无效,写入操作时触发访问违规。
修复方案
将代码中的Cardinal替换为NativeUInt类型(该类型在32位环境下为32位,64位环境下为64位,自动适配平台),修改后的代码如下:
PWord(NativeUInt(NotifyRecord.AMsg) + NotifyData^.FileNameLength)^ := 0;
验证
修改后重新编译64位程序,测试文件夹重命名操作,Access Violation问题应可解决。
内容的提问来源于stack exchange,提问作者AFerns100
相关产品推荐
相关产品推荐

