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

Win64 Delphi应用中AddFontResource函数失效问题求助

解决Win11下Delphi 64位VCL应用AddFontResource失效问题

针对你的场景,以下是几个针对性的排查和修复步骤:

1. 修复路径拼接错误

你的代码中_FontFile := _FontFolder + _Resorce + '.TTF';存在隐患:如果_FontFolder末尾没有路径分隔符\,拼接后的路径会变成类似C:\Users\...\FontsARIALN.TTF,导致文件路径无效。

修复方式:使用IncludeTrailingPathDelimiter确保路径格式正确:

_FontFolder := IncludeTrailingPathDelimiter(TSpecialFolders.GetAppDataFontFileFolder);
_FontFile := _FontFolder + _Resorce + '.TTF';

2. 替换为AddFontResourceEx加载私有字体

Win11对系统字体加载的限制更严格,AddFontResource兼容性不如AddFontResourceEx。建议使用后者并指定FR_PRIVATE标志(仅当前进程可用,避免干扰系统字体池):

// 先声明API(若单元未包含)
function AddFontResourceEx(lpszFilename: PChar; fl: DWORD; pdv: Pointer): Integer; stdcall; external 'gdi32.dll';
const
  FR_PRIVATE = $10;

// 替换原AddFontResource调用
AddFontResourceEx(PChar(_FontFile), FR_PRIVATE, nil);

3. 检查字体加载返回值

添加返回值检查,确认字体是否真的加载成功:

var
  LoadCount: Integer;
begin
  // ...
  LoadCount := AddFontResourceEx(PChar(_FontFile), FR_PRIVATE, nil);
  if LoadCount = 0 then
  begin
    ShowMessage('加载字体失败: ' + _FontFile); // 用于排查问题
  end;
  // ...
end;

4. 验证导出的字体文件完整性

手动打开_FontFolder下的TTF文件,确认系统能正常识别(双击文件查看预览)。如果文件损坏,说明资源导出存在问题:

  • 检查Delphi资源配置:确保64位目标平台下资源已正确嵌入
  • 确认资源名和类型完全匹配:TResourceStream.Create中的资源名、类型要和资源文件定义一致(注意大小写统一)

5. 直接指定字体名称使用

无需依赖Screen.Fonts的更新,直接在需要使用字体的地方指定名称即可:

// 示例:给Label设置Arial Narrow字体
Label1.Font.Name := 'Arial Narrow';
Label1.Font.Size := 12;

6. 确认文件夹权限

虽然AppData\Roaming是用户目录,但Win11的UAC可能限制操作。右键字体文件夹→属性→安全,确认当前用户拥有读写权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:57:48