AutoCAD crash khi mở palette ứng dụng AJS do font Windows bị hỏng
AutoCAD tự đóng (crash) ngay khi gõ lệnh mở bảng điều khiển (palette) của ứng dụng AJS, ví dụ lệnh QD. Lỗi không nằm ở ứng dụng mà ở font của Windows bị hỏng: một font đã được khai báo với Windows nhưng tệp font thật không còn.
Dấu hiệu nhận biết
- Gõ lệnh mở palette (
QD, …) thì AutoCAD đóng ngay, hiện hộp thoại gửi báo cáo lỗi của Autodesk. - Các lệnh không mở palette vẫn chạy bình thường.
- Trong tệp báo cáo lỗi (
...dmpuserinfo.xml) có các dòng:
System.IO.FileNotFoundException: Unable to find the specified file.
at MS.Internal.Text.TextInterface.FontList.get_Item(UInt32 A_0)
at MS.Internal.FontFace.PhysicalFontFamily.MapGlyphTypeface(...)
...
at Autodesk.AutoCAD.Windows.PaletteSet.AddCore(String name, AcMgPalette* pPal)
Nguyên nhân
Palette của ứng dụng AJS dùng các biểu tượng (📐 ⚡ 🗙 …). Font giao diện không có sẵn các ký tự này, nên Windows (WPF) duyệt danh sách font của máy để tìm font thay thế. Nếu trong danh sách có một font đã khai báo trong registry nhưng tệp .ttf/.otf đã bị xoá hoặc di chuyển, WPF báo FileNotFoundException và AutoCAD đóng.
Trường hợp hay gặp: font tải từ các trang chia sẻ font và cài chỉ cho người dùng hiện tại. Tệp nằm trong C:\Users\<tên>\AppData\Local\Microsoft\Windows\Fonts, sau đó bị phần mềm dọn rác hoặc người dùng xoá mất.
Cùng một máy, palette của các ứng dụng AJS khác (và của phần mềm khác dùng WPF) cũng có thể bị lỗi tương tự.
Cách khắc phục
Bước 1. Tìm font bị hỏng
Mở Windows PowerShell (không cần quyền Administrator), dán đoạn lệnh sau rồi nhấn Enter:
$dirs = "$env:WINDIR\Fonts", "$env:LOCALAPPDATA\Microsoft\Windows\Fonts"
foreach ($k in 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts','HKCU:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts') {
$p = Get-ItemProperty $k -ErrorAction SilentlyContinue; if (!$p) { continue }
$p.PSObject.Properties | ? { $_.Name -notlike 'PS*' } | % {
$f = $_.Value; $ok = if ([IO.Path]::IsPathRooted($f)) { Test-Path $f } else { $dirs | ? { Test-Path (Join-Path $_ $f) } }
if (-not $ok) { "{0} | {1} | {2}" -f $k.Split('\')[0], $_.Name, $f }
}
}
Mỗi dòng kết quả là một font hỏng, gồm 3 phần: nơi khai báo (HKLM: hoặc HKCU:), tên font, đường dẫn tệp đã mất. Ví dụ:
HKCU: | Roboto Bold Condensed (TrueType) | C:\Users\Admin\AppData\Local\Microsoft\Windows\Fonts\roboto-bold-condensed_[allfont.net].ttf
Không có dòng nào ⇒ bỏ qua Bước 2, làm tiếp từ Bước 3.
Bước 2. Xoá khai báo font hỏng
Với mỗi dòng ở Bước 1, chạy lệnh dưới đây, thay TÊN FONT bằng phần thứ hai của dòng đó (giữ nguyên cả (TrueType)):
- Dòng bắt đầu bằng
HKCU:— PowerShell thường:
Remove-ItemProperty -Path 'HKCU:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts' -Name 'TÊN FONT'
- Dòng bắt đầu bằng
HKLM:— PowerShell mở bằng Run as Administrator:
Remove-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts' -Name 'TÊN FONT'
Chạy lại lệnh ở Bước 1: kết quả phải trống.
Chỉ cài lại font thì chưa đủ: bản cài mới thường có tên tệp khác, mục khai báo cũ vẫn trỏ tới tệp đã mất. Luôn xoá mục hỏng như trên.
Bước 3. Xoá bộ đệm font WPF
Mở PowerShell bằng Run as Administrator, chạy:
Stop-Service FontCache3.0.0.0 -Force -ErrorAction SilentlyContinue; Stop-Service FontCache -Force -ErrorAction SilentlyContinue; Remove-Item "$env:WINDIR\ServiceProfiles\LocalService\AppData\Local\FontCache-3.0.0.0*.dat","$env:WINDIR\ServiceProfiles\LocalService\AppData\Local\FontCache\*" -Force -Recurse -ErrorAction SilentlyContinue
Bước 4. Khởi động lại máy
Bắt buộc khởi động lại Windows (chỉ tắt AutoCAD là chưa đủ), sau đó mở AutoCAD và thử lại lệnh.
Bước 5. Cài lại font (nếu vẫn cần dùng)
Chuột phải vào tệp font → chọn Install for all users (Cài cho mọi người dùng). Font sẽ nằm trong C:\Windows\Fonts, không bị mất khi dọn thư mục người dùng.
Nếu vẫn còn lỗi
- Kiểm tra trong
C:\Windows\Fontscòn Segoe UI Emoji (seguiemj.ttf) và Segoe UI Symbol (seguisym.ttf). Thiếu thì mở Command Prompt bằng Run as Administrator và chạysfc /scannowđể Windows tự khôi phục. - Gửi tệp báo cáo lỗi mới (
...dmpuserinfo.xml, đường dẫn hiện trong hộp thoại báo lỗi của Autodesk) cho bộ phận hỗ trợ AJS.