COM execution is performed at a low level by controlling the version of the interfaces and changing the CLSID (AND IIDs of any changed interfaces). The control's progID is also versioned by adding a .version number. Obviously, installation paths should be different.
For example, to download Internet explorer as a web control, you can create a shell.explorer object to create the latest version of shell.explorer.1, shell.explorer.2, etc. The versions of the shell.explorer control registered in different CLSIDs are the same VersionIndependentProgID tho file, so when the application tries to create an inactive ProgID, it gets the latest version.
source share