Guide to Understanding ProgIDs and File Type Associations

A ProgID is the link between a Windows file type or protocol and the application that handles it. Understanding that link makes it much easier to inspect, troubleshoot, and deploy default associations.

The essential distinction: registering a ProgID tells Windows that an application can handle a file type. Selecting that ProgID as the user’s default tells Windows which application it should use.

What is a ProgID?

For Windows Shell file associations, a programmatic identifier (ProgID) is a registry key that describes a file type or protocol handler. A typical name combines a vendor or application name with a component, for example Contoso.TextFile.

The ProgID can define a friendly type name, an icon, and Shell verbs such as open, print, or edit. The command below the shell\open\command key tells Windows which executable to launch:

HKEY_CLASSES_ROOT\Contoso.TextFile
  (Default) = "Contoso Text Document"
  DefaultIcon
    (Default) = "C:\Program Files\Contoso\Contoso.exe,0"
  shell
    open
      command
        (Default) = "\"C:\Program Files\Contoso\Contoso.exe\" \"%1\""

Here, %1 is replaced with the path of the file being opened. The ProgID does not itself make .txt files open with Contoso; it only describes the handler that Windows can use.

Terminology note: ProgIDs are also used by COM. This article focuses on the Shell ProgIDs used for file and protocol associations.

How a file association fits together

A file association connects an extension or protocol to a ProgID. The ProgID then resolves to the application command:

.txt Contoso.TextFile shell\open\command Contoso.exe "%1"

The same principle applies to protocols:

https BrowserHTML browser launch command

Applications normally register their supported ProgIDs during installation. Windows can then present those applications as available handlers. Registration alone does not make an application the current user’s default.

Where ProgIDs are stored

ProgID definitions can be registered for the entire computer or only for the current user.

Machine-wide registration

HKEY_LOCAL_MACHINE\Software\Classes\<ProgID>

ProgIDs registered here are available to all users of the computer.

Per-user registration

HKEY_CURRENT_USER\Software\Classes\<ProgID>

ProgIDs registered here are available only to the current user. A per-user entry can override a machine-wide entry with the same key name.

What HKEY_CLASSES_ROOT shows

HKEY_CLASSES_ROOT (HKCR) is not a separate copy of this information. It is a merged view of the machine-wide and per-user Software\Classes locations:

HKEY_CURRENT_USER\Software\Classes
                 +
HKEY_LOCAL_MACHINE\Software\Classes
                 ↓
HKEY_CLASSES_ROOT

This merged view lets applications query the effective class and association data for the interactive user. Microsoft documents the exact merge behavior in Merged View of HKEY_CLASSES_ROOT.

Registration is not the same as the user’s default

This distinction is especially important on modern Windows:

  • ProgID registration describes an available handler and its commands.
  • Default-app selection records which registered handler the current user has selected for an extension or protocol.

Windows stores current per-user choices in UserChoice keys. Examples include:

# File extension
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.pdf\UserChoice

# URL protocol
HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice

On current Windows versions, these selections are protected. Directly changing a ProgID definition, running assoc or ftype, or writing a machine-wide extension mapping does not reliably replace the current user’s default.

Practical rule: create or install the ProgID first. Then assign the extension or protocol to that ProgID for the user.

How to identify the correct ProgID

Before changing an association, confirm that the target ProgID exists and resolves to the expected executable. SetUserFTA can show the effective association, its location, the ProgID, and the resolved command line:

SetUserFTA.exe query .pdf

To inspect all current user associations:

SetUserFTA.exe get

For browsers, use the dedicated command to list installed browsers and their ProgIDs:

SetUserFTA.exe browser

Once you have verified the target ProgID, you can assign it to an extension or protocol:

SetUserFTA.exe set .pdf <ProgID>
SetUserFTA.exe set https <ProgID>

See the SetUserFTA query documentation for the complete syntax and output.

Creating or repairing a ProgID

If the application does not register a usable ProgID, the ProgID must be created or repaired before it can be selected as a working association. At minimum, the ProgID needs a valid shell\open\command. A friendly name and icon are also recommended.

ProgIDTool can display, copy, export, rename, delete, and register file-type ProgIDs without requiring you to edit every registry value manually.

Summary

  • A ProgID describes how Windows should handle a file type or protocol.
  • ProgIDs can be registered machine-wide or for the current user.
  • HKEY_CLASSES_ROOT is a merged view of those registration locations.
  • Registering a ProgID does not automatically make it the user’s default.
  • Verify that a ProgID exists and resolves correctly before assigning it with SetUserFTA.