“The program can’t start because a DLL is missing”
By Andrew Nakas · Published September 22, 2026 · ~8 minute read
You double-click a program and Windows replies that it cannot start because some file ending in .dll is missing, and suggests reinstalling. The name is usually something like VCRUNTIME140.dll, MSVCP140.dll, api-ms-win-crt-runtime-l1-1-0.dll, or something specific to the program itself.
The error is more informative than it looks, and the first result for it is almost always the worst possible advice. Both of those are worth going into.
What a DLL is, and why programs are missing them
A DLL is a library: compiled code kept in a separate file so that many programs can share one copy instead of each carrying its own. Everything that draws a window on Windows uses the same user32.dll; everything that opens a file uses the same kernel32.dll. It is a good design and it is why Windows installs are not a hundred times larger than they are.
The cost of sharing is that a program does not carry everything it needs. It carries a list of what it needs — every library, and every function within each library, written in plain text inside the executable. At startup Windows reads that list and loads each one. If any single entry cannot be found, the program does not start at all, and you get that dialog. It never runs a line of its own code.
Where Windows looks
Understanding the second cause below needs one more piece: Windows does not search your whole disk for a library. It looks in a fixed order, and the first place it looks is the folder the program itself is in. After that, roughly, come the system directories, then the current working directory, then each folder listed in your PATH.
That first step is why moving an .exe out of its folder breaks it so reliably, and why "it worked on their machine" is usually not a mystery — their copy still had its neighbours. It is also why copying a missing library into the program's own folder sometimes appears to work when nothing else does.
The four causes
- A runtime was never installed. By far the most common. Programs built with Microsoft's C++ compiler need the Visual C++ Redistributable, and it is not part of Windows. A program built with the 2015–2022 toolchain wants
VCRUNTIME140.dllandMSVCP140.dll; one from 2013 wantsMSVCR120.dll. If the name starts withMSVC,VCRUNTIMEorapi-ms-win-crt, this is almost certainly your cause. - The program was moved out of its folder. Someone copied the
.exeout of a directory that also contained its own libraries. The program is looking for a file that was sitting right next to it a moment ago. Extremely common with portable software and with anything pulled out of an installer. - The install is damaged. An uninstaller took a shared library with it, an update was interrupted, or a disk error removed something. This is the case the Windows dialog is describing when it suggests reinstalling.
- Something removed it. Antivirus quarantine, usually. Check the quarantine list before anything else if the file used to work.
Never download a DLL from a DLL site
Search any missing DLL name and the first page of results will be sites offering that exact file for download. Do not use them. This is the most widely repeated bad advice in Windows troubleshooting and it is worth being blunt about why:
- You have no idea what you are downloading. A DLL is executable code, loaded into your process by a program you trust, with that program's permissions. It is a near-perfect delivery vehicle, and these sites are an obvious place to put one.
- Even an honest copy is likely wrong. System libraries are versioned together. Dropping one 2015 file into a 2022 set produces a different failure, often a stranger one.
- It fixes a symptom. If
MSVCP140.dllis missing, the runtime is not installed, and every other program needing it will fail too. Installing the redistributable fixes all of them, permanently, from Microsoft.
There is a second reason beyond malware, and it follows directly from the search order above. Because the program's own folder is searched first, a library placed next to an executable takes precedence over the real system one. A program asks for a routine library; it gets yours instead; your code runs inside it. That technique has a name — DLL hijacking — and it is why dropping an unknown file next to a trusted program is worse than running an unknown program on its own.
The fixes, in order
- Install the Visual C++ Redistributable from Microsoft, if the name looks like a runtime. Install both the x64 and x86 versions — a 32-bit program needs the 32-bit runtime even on 64-bit Windows, and that catches a lot of people. One download fixes the whole class of error.
- Check the program is still in its own folder, with everything that was shipped alongside it. If you extracted an archive, extract all of it, not just the
.exe. - Reinstall the program from its original source. Boring, and frequently correct.
- Check antivirus quarantine if it worked yesterday.
- Run
sfc /scannowin an administrator Command Prompt if the missing file is a genuine Windows system library. It repairs Windows' own files from a known-good store. - Install DirectX or .NET if the name points that way —
d3dx9_43.dlland similar come from the DirectX End-User Runtime, which old games need and modern Windows does not include.
The common names, and what each one means
| Missing file | What it belongs to | Fix |
|---|---|---|
VCRUNTIME140.dll, MSVCP140.dll | Visual C++ 2015–2022 | Install that redistributable, both architectures |
MSVCR120.dll, MSVCP120.dll | Visual C++ 2013 | Install the 2013 redistributable |
MSVCR100.dll | Visual C++ 2010 | Install the 2010 redistributable |
api-ms-win-crt-*.dll | The Universal C Runtime | Windows Update, or the 2015+ redistributable |
d3dx9_*.dll, xinput1_3.dll | Legacy DirectX | DirectX End-User Runtime from Microsoft |
MSVBVM60.dll | Visual Basic 6 | The VB6 runtime |
| Anything else, oddly named | The program itself | Reinstall, or keep it in its folder |
Find out what the program actually wants
The dialog names one missing library — the first one Windows failed to find. There may be more behind it, and you will discover them one dialog at a time.
You do not have to guess, because the full list is inside the file. The import table names every library and every function the program intends to call, and it can be read without running anything. Drop the .exe into the EXE viewer and it lists them: the Windows libraries it needs, the runtime version it was built against, and any libraries of its own it expects to find beside it. That turns "which runtime do I install?" from a search into a reading.
It also answers the question underneath: whether the program is 32-bit or 64-bit, which decides which redistributable you need.
When the program is simply too old
Sometimes nothing is missing in a way you can fix. A program built for Windows 95 may want a 16-bit library that 64-bit Windows cannot load at all, and no download will change that — the 16-bit subsystem is gone. Others expect libraries that shipped with a version of Windows that no longer exists.
At that point the answer is a compatibility layer rather than a file: a virtual machine with the old Windows on it, or an emulated environment that already contains the right era of libraries. Running it in a browser tab is the lowest-effort version of that — the environment there is Wine 1.7.55, which is a 2015 snapshot of the Windows API, and it carries the old libraries as a matter of course. Why old programs stop working goes through the other causes.
The short version
A missing DLL nearly always means a runtime that was never installed, or a program separated from the files it shipped with. Install the Visual C++ Redistributable, keep the program in its folder, and reinstall from the original source. Do not download loose DLLs from search results. And if you want to know what the program is really asking for rather than finding out one dialog at a time, read its import table.