I personally think one of the main design problems of COM was that, ironically (given its name), it never really had "component" as a first-class concept. It was all about interfaces, and the rules on how implementation of IUnknown's QueryInterface must behave really highlight that: it's almost impossible to delegate to/compose over another component if that component was not written with this scenario in mind.