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

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仿真问题的步骤

  1. 打开Windows 11的反馈中心应用(通过开始菜单搜索即可找到)。
  2. 点击右上角“新建反馈”按钮,选择“问题”类型。
  3. 在详细描述中提供以下信息:
    • 问题场景:Delphi 7编译的x86 32位应用在Windows 11 ARM64上运行时,SysUtils.CvtInt64依赖FPU的逻辑返回错误值。
    • 具体示例:IntToHex($FF00FF55AA55AA)返回00FF00FF55AA55A8、IntToHex($123456789ABCDEF)返回0123456789ABCDE0。
    • 排查结果:32位整数转换(依赖CvtInt)正常,逆操作StrToInt()正常,问题仅存在于FPU依赖的64位整数转换逻辑。
  4. 选择分类:“Windows兼容性”>“应用兼容性(x86应用在ARM上)”。
  5. 添加附件:简化后的测试项目代码、运行截图等,帮助微软复现问题。
  6. 提交反馈后会收到跟踪编号,可在反馈中心查看后续处理进度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 23:26:18