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
相关产品推荐
相关产品推荐

