Chuyện gì đang xảy ra
Bạn double-click vào file thực thi và ngay lập tức nhận được:
The application was unable to start correctly (0xc000007b). Click OK to close the application.
Mã lỗi 0xc000007b tương ứng với STATUS_INVALID_IMAGE_FORMAT trong nhân Windows NT. Hiểu đơn giản: một ứng dụng 32-bit đã cố tải DLL 64-bit (hoặc ngược lại). Đây là lỗi không tương thích kiến trúc — file DLL vẫn tồn tại trên đĩa, nhưng Windows từ chối tải nó vì bitness sai.
Cần nhấn mạnh: đây không phải lỗi "DLL not found". File vẫn ở đó. Chỉ là nó không thể được dùng bởi tiến trình đó. Sự khác biệt này quan trọng khi chọn cách sửa.
Bước 1 — Xác định DLL lỗi trước khi làm bất cứ điều gì
Cài đặt lại bừa bãi chỉ tốn thời gian. Hãy dành hai phút để xác định DLL nào là thủ phạm. Process Monitor (Sysinternals) và Dependency Walker đều dùng được — lọc theo tên tiến trình và tìm các sự kiện tải thất bại.
Không có công cụ bên thứ ba? Dùng lệnh where tích hợp sẵn để xem Windows phân giải đường dẫn DLL nào:
where msvcp140.dll
where vcruntime140.dll
where msvcr120.dll
Tìm thấy kết quả cả trong C:\Windows\SysWOW64\ lẫn C:\Windows\System32\ là hoàn toàn bình thường — đó là cách Windows xử lý 32-bit và 64-bit song song. Vấn đề xảy ra khi ứng dụng 32-bit vô tình lấy phải phiên bản 64-bit. Điều này thường xảy ra khi ai đó đã thả thẳng một DLL sai bitness vào thư mục ứng dụng.
Để kiểm tra trực tiếp kiến trúc của một DLL, dán đoạn này vào PowerShell:
$bytes = [System.IO.File]::ReadAllBytes('C:\Windows\System32\msvcp140.dll')
$peOffset = [System.BitConverter]::ToInt32($bytes, 0x3C)
$machine = [System.BitConverter]::ToUInt16($bytes, $peOffset + 4)
if ($machine -eq 0x8664) { "64-bit" } elseif ($machine -eq 0x14c) { "32-bit" } else { "Unknown: $machine" }
Thay tên DLL bạn nghi ngờ vào. Ứng dụng 32-bit cần 0x14c (x86). Nếu ra 0x8664 (x64), đó chính là chỗ không tương thích.
Bước 2 — Xóa các DLL lạ trong thư mục ứng dụng
Một số bộ cài đặt đóng gói DLL runtime cùng với file thực thi. Khi các bản sao đó sai kiến trúc, chúng che khuất các DLL hệ thống đúng — và ứng dụng bị lỗi.
dir "C:\path\to\your\app\*.dll"
Nếu thấy các file như msvcp140.dll, vcruntime140.dll, hoặc msvcp_win.dll nằm cạnh file .exe, hãy kiểm tra bitness của chúng bằng đoạn PowerShell ở trên. Sai kiến trúc? Xóa chúng đi. Ứng dụng sẽ tự dùng các bản sao hệ thống đúng trong System32 hoặc SysWOW64.
Bước 3 — Cài lại Visual C++ Redistributables (cả x86 lẫn x64)
Cách này giải quyết được khoảng 70% trường hợp. Các ứng dụng viết bằng C++ cần MSVC runtime được cài đặt — nếu phiên bản đúng bị hỏng hoặc thiếu, lỗi 0xc000007b sẽ xuất hiện.
Tìm trên trang Microsoft với từ khóa "Microsoft Visual C++ Redistributable latest" và tải về:
- Visual C++ 2015-2022 Redistributable — x86 (ứng dụng 32-bit cần cái này dù đang chạy Windows 64-bit)
- Visual C++ 2015-2022 Redistributable — x64
- Ứng dụng cũ có thể cần thêm phiên bản 2013 và 2012
Cài phiên bản x86 dù Windows của bạn là bản nào. Hầu hết game và phần mềm desktop cũ đều là 32-bit và lấy DLL từ SysWOW64, không phải System32. Bỏ qua x86 là lỗi phổ biến hay gặp.
Sau khi cài xong, khởi động lại — rồi kiểm tra những gì đã được cài:
Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -like "*Visual C++*" } | Select-Object Name, Version | Sort-Object Name
Bước 4 — Sửa file hệ thống Windows bằng SFC và DISM
Các DLL hệ thống Windows bị hỏng sẽ không được sửa bằng cách cài lại redistributables. Nếu chính msvcp140.dll bên trong System32 bị hỏng, không bộ cài nào đụng tới nó được. Chạy các lệnh sau với quyền Administrator:
# Bước 1: System File Checker
sfc /scannow
# Bước 2: Nếu SFC báo lỗi không sửa được, hãy sửa component store trước
DISM /Online /Cleanup-Image /RestoreHealth
# Bước 3: Chạy lại SFC sau khi DISM hoàn tất
sfc /scannow
Quá trình này mất khoảng 10–20 phút tùy tốc độ đĩa. Thông báo "Windows Resource Protection found corrupt files and repaired them" nghĩa là thành công — khởi động lại và thử mở ứng dụng.
Bước 5 — Xác nhận kiến trúc của chính file thực thi
Đôi khi cách sửa đơn giản chỉ là chạy đúng phiên bản ứng dụng. Nếu nhà cung cấp có cả bộ cài 32-bit lẫn 64-bit, cài nhầm sẽ gây ra đúng lỗi này.
$bytes = [System.IO.File]::ReadAllBytes('C:\path\to\app.exe')
$peOffset = [System.BitConverter]::ToInt32($bytes, 0x3C)
$machine = [System.BitConverter]::ToUInt16($bytes, $peOffset + 4)
if ($machine -eq 0x8664) { "64-bit EXE" } elseif ($machine -eq 0x14c) { "32-bit EXE" } else { "Unknown" }
Phát hiện EXE 32-bit trong khi cần 64-bit? Gỡ cài đặt, lấy bộ cài đúng từ nhà cung cấp, và cài lại từ đầu.
Bước 6 — Sửa .NET Framework (chỉ áp dụng cho ứng dụng .NET)
Một phần nhỏ lỗi 0xc000007b xuất phát từ bản cài .NET bị hỏng thay vì MSVC. Nếu ứng dụng dùng .NET — thường thấy trong tài liệu hoặc bộ cài của nó — hãy tải Microsoft .NET Framework Repair Tool từ trang Microsoft và chạy. Công cụ này xử lý các tình huống hỏng .NET phổ biến nhất mà không cần can thiệp thủ công.
Kiểm tra kết quả
Sau bất kỳ cách sửa nào ở trên:
- Khởi động lại máy. Bắt buộc — các DLL đang được tải vào bộ nhớ sẽ không được làm mới nếu không reboot.
- Mở ứng dụng bình thường.
- Vẫn lỗi? Mở Event Viewer → Windows Logs → Application. Tìm mục lỗi. Phần chi tiết thường ghi tên cụ thể DLL từ chối tải — đó là mục tiêu cụ thể tiếp theo cần xử lý.
# Lấy các lỗi 0xc000007b gần đây từ Event Viewer
Get-EventLog -LogName Application -EntryType Error -Newest 20 | Where-Object { $_.Message -like "*0xc000007b*" -or $_.Source -eq "Application Error" } | Format-List TimeGenerated, Message
Tổng hợp nhanh: các cách sửa theo thứ tự khả năng
- Phổ biến nhất (~70%): Cài lại Visual C++ Redistributables — x86 + x64, 2015-2022
- Phổ biến thứ hai: Xóa các DLL lạ trong thư mục ứng dụng
- File hệ thống bị hỏng: Chạy
DISM /RestoreHealth, rồisfc /scannow - Ứng dụng .NET: Chạy .NET Framework Repair Tool
- Giải pháp cuối cùng: Gỡ cài đặt sạch sẽ, rồi cài lại ứng dụng
Tại sao lỗi này cứ lặp đi lặp lại?
Hầu hết các trường hợp đều xuất phát từ một trong bốn tình huống sau:
- Bản cập nhật phần mềm đã thay thế DLL hệ thống 64-bit bằng bản 32-bit (hoặc ngược lại)
- Bộ cài đặt đóng gói DLL sai kiến trúc cạnh file thực thi
- Phần mềm diệt virus đã cách ly hoặc chỉnh sửa DLL runtime — lặng lẽ, không thông báo
- Gỡ cài đặt không hoàn chỉnh để lại các mảnh DLL hỏng và giờ chúng được ưu tiên hơn bản sao hệ thống sạch
Nếu bạn phát triển ứng dụng: đừng bao giờ đóng gói msvcp*.dll hoặc vcruntime*.dll trong thư mục ứng dụng trừ khi đã xác nhận chúng khớp với build target của bạn. Hãy dùng MSVC Redistributable merge modules chính thức hoặc bộ cài standalone — đó chính xác là mục đích của chúng.

