Code reuse is a compelling idea. Software componentry would decompose solutions into not only classes and modules, but also into reusable components. So far, in practice, reusable components have not materialized in a big way. It would be nice to see those fat books of patterns implemented as components and widely reused, if that's even technically possible.
As to COM, it solved a bunch of problems and created more. Like the "Hello, World!" C++ program in Petzold that is some 200 lines long, a COM solution contains many an arcane line that caters to the dainty way COM objects must be approached to get them to do anything. And using COM objects from across a network is an absolute nightmare. Stubs and proxies indeed. Worst of all, the Registry is highly involved in GUID-to-<anything> mapping. Any mishap in there and the application crashes without hope of repair. Only replace.
In the end, COM served a very important purpose as a way to deliver versionable software. Microsoft wrote millions of lines using COM. COM's most important function was to serve as an example of how to burden programmers with issues they should not be bothered with like reference counting and instantiation. The bit level constraints on the design of COM rose up and bit everyone who tried to play nice with it. Out of COM came .NET Framework, which accomplishes most of what COM does without the muss, fuss, or bother. Hide the wires brother and sister programmers!