Delphi7编译x86应用在Win11 ARM64上的FPU兼容性问题求助
解决方案
一、不依赖FPU的Int64转换替代实现及替换方法
Delphi 7的SysUtils.CvtInt64因依赖FPU导致在Windows 11 ARM64上运行出错,你可以用纯整数运算实现对应的转换逻辑,完全规避FPU依赖:
1. 替代IntToHex(Int64)的实现
function IntToHex64(Value: Int64; Digits: Integer): string; const HexChars: array[0..15] of Char = '0123456789ABCDEF'; var I: Integer; Temp: Int64; begin SetLength(Result, Digits); Temp := Value; for I := Digits downto 1 do begin Result[I] := HexChars[Temp and $F]; Temp := Temp shr 4; end; end; // 重载默认IntToHex,适配Int64参数 function IntToHex(Value: Int64): string; begin if Value >= 0 then Result := IntToHex64(Value, 16) else Result := IntToHex64(Value, 16); // 负数按补码处理,与原函数逻辑保持一致 end;
2. 替代IntToStr(Int64)的实现
function IntToStr64(Value: Int64): string; const Digits: array[0..9] of Char = '0123456789'; var IsNegative: Boolean; Temp: Int64; I: Integer; begin IsNegative := Value < 0; if IsNegative then Temp := -Value else Temp := Value; SetLength(Result, 20); // 足够容纳最大Int64的位数 I := 20; repeat Dec(I); Result[I] := Digits[Temp mod 10]; Temp := Temp div 10; until Temp = 0; if IsNegative then begin Dec(I); Result[I] := '-'; end; Result := Copy(Result, I, 20 - I + 1); end; // 重载默认IntToStr,适配Int64参数 function IntToStr(Value: Int64): string; begin Result := IntToStr64(Value); end;
3. 替换方法
- 将上述函数放在自定义单元(如
CustomSysUtils.pas)中,确保该单元在项目引用列表中位于SysUtils单元之前。Delphi会优先使用当前单元中重载的函数,替代原SysUtils中的版本。 - 全局替换可在项目
dpr文件中调整单元顺序:
program YourApp; uses CustomSysUtils, // 优先加载 SysUtils, ...;
二、向微软反馈Windows 11 ARM64 FPU仿真问题的步骤
- 打开Windows 11的反馈中心应用(通过开始菜单搜索即可找到)。
- 点击右上角“新建反馈”按钮,选择“问题”类型。
- 在详细描述中提供以下信息:
- 问题场景:Delphi 7编译的x86 32位应用在Windows 11 ARM64上运行时,
SysUtils.CvtInt64依赖FPU的逻辑返回错误值。 - 具体示例:
IntToHex($FF00FF55AA55AA)返回00FF00FF55AA55A8、IntToHex($123456789ABCDEF)返回0123456789ABCDE0。 - 排查结果:32位整数转换(依赖
CvtInt)正常,逆操作StrToInt()正常,问题仅存在于FPU依赖的64位整数转换逻辑。
- 问题场景:Delphi 7编译的x86 32位应用在Windows 11 ARM64上运行时,
- 选择分类:“Windows兼容性”>“应用兼容性(x86应用在ARM上)”。
- 添加附件:简化后的测试项目代码、运行截图等,帮助微软复现问题。
- 提交反馈后会收到跟踪编号,可在反馈中心查看后续处理进度。
内容的提问来源于stack exchange,提问作者emmanuel
相关产品推荐
相关产品推荐

