It's hard to find a component that does exactly what you need - software, electrical, or mechanical. Normally quite a bit of extra stuff is required to get it do what you want.
Current software component technologies like DLL's, ActiveX, COM, etc have their issues. Versioning can be really fun. Getting everything registered and working can be lots of fun. Commercial components are often a major pain in the butt - not just the cost, but the headaches installing it on development machines, license keys, etc.
The component model limits what can be done - for example, I can develop much quicker using only dynamic language such as Python than to split everything into COM objects, just because COM does not support Python's advanced features.
That's why I think the way forward is dynamic languages that can be used to bind together existing libraries and components quickly - and add the necessary logic on top - not "drop and connect" of existing components.
BTW, the "component vision" was promoted by Sandstone (Objective C guys) in the mid 80's. It was a failure then. It might work if everyone agreed on one language, and one way to do everything. But that's not reality. (And, yes, the world might be a better place if Objective C was dominant instead of C++. But there still is no silver bullet.)