Installing Windows applications today is a multi-step process. In the typical case, installing an application involves copying a number of software components to the disk and making a series of registry entries that describe those components to the system. The separation between the entries in the Registry and the files on disk makes it very difficult to determine exactly what needs to be removed to uninstall an application.
In addition, the relationship between the various entries required to fully describe a COM class in the registry is very loose. These entries often include entries for coclasses, interfaces, typelibs and DCOM app ids, not to mention any entries made to register document extensions or component categories. Often times these entries require manual inspection to verify consistency.
Finally, a registry footprint is required to activate any COM class. This drastically complicates the process of deploying distributed applications because each client machine must be touched to make the appropriate registry entries.