ExeBrowser

Run Windows .exe files in your browser. No install. No upload. Just WebAssembly + Wine.

“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

  1. 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.dll and MSVCP140.dll; one from 2013 wants MSVCR120.dll. If the name starts with MSVC, VCRUNTIME or api-ms-win-crt, this is almost certainly your cause.
  2. The program was moved out of its folder. Someone copied the .exe out 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.
  3. 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.
  4. 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:

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

  1. 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.
  2. 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.
  3. Reinstall the program from its original source. Boring, and frequently correct.
  4. Check antivirus quarantine if it worked yesterday.
  5. Run sfc /scannow in an administrator Command Prompt if the missing file is a genuine Windows system library. It repairs Windows' own files from a known-good store.
  6. Install DirectX or .NET if the name points that way — d3dx9_43.dll and 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 fileWhat it belongs toFix
VCRUNTIME140.dll, MSVCP140.dllVisual C++ 2015–2022Install that redistributable, both architectures
MSVCR120.dll, MSVCP120.dllVisual C++ 2013Install the 2013 redistributable
MSVCR100.dllVisual C++ 2010Install the 2010 redistributable
api-ms-win-crt-*.dllThe Universal C RuntimeWindows Update, or the 2015+ redistributable
d3dx9_*.dll, xinput1_3.dllLegacy DirectXDirectX End-User Runtime from Microsoft
MSVBVM60.dllVisual Basic 6The VB6 runtime
Anything else, oddly namedThe program itselfReinstall, 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.

Keep reading