Well, it does suck. Coding it up in C++ is especially cumbersome... and it is Windows-only, mainly because it is very difficult to use COM without registering everything in the Registry.
It's brittle; it is not designed to support any kind of incremental change. If you change an interface, even just to add a new method, you must generate a new GUID, and now software coded against the old interface can't find your new version unless you've got a compatibility class in there. You can try to cheat by adding methods to the bottom - COM never stops you from shooting yourself in the foot - and this is safe in limited circumstances but causes crashes otherwise.
There's two kinds of COM, the dynamic VB-style interfaces (can't remember the technical term for this) and the static C++-style interfaces. The dynamic kind is easy to use from VB but a pain in the ass to use from C++.
There are no standard nontrivial data types, such as lists or hashtables. There are no generic types.
It uses confusing terminology like "apartments" that the MS documentation explains poorly.
So, I always prefer C# / .NET for interoperability, as well as for Windows app development in general... especially since much of your code can run on Linux/Mac too. There is also a .NET interpreter for web browsers now ("Blazor").