I don’t know. I mean, even classic Win32 has around two and a half object systems: windows+messages, standard COM, and IDispatch{,Ex}; and they are all rather different. (IDispatch and IDispatchEx, while a bit different from each other, are also neither particularly easy to use from C nor particularly good at their original purpose[1], so I’m counting them as half a system.)
Then there is Objective-C... OK, I don’t know that it’s that usable without a preprocessor, but there are Piumarta’s id[2] and Finch’s cobj[3], which are reasonably different from either of the Win32 systems.
(I don’t know to which degree DCE is relevant to COM in this comparison, given that in the intraprocess case all it inherits from there is the IDL and the non-exposed wire format when marshalling between apartments. Technically RPCRT4.DLL does contain obvious counterparts of DCE functions, but I haven’t yet found any Microsoft documentation suggesting you actually use those for anything.)
Then there is Objective-C... OK, I don’t know that it’s that usable without a preprocessor, but there are Piumarta’s id[2] and Finch’s cobj[3], which are reasonably different from either of the Win32 systems.
(I don’t know to which degree DCE is relevant to COM in this comparison, given that in the intraprocess case all it inherits from there is the IDL and the non-exposed wire format when marshalling between apartments. Technically RPCRT4.DLL does contain obvious counterparts of DCE functions, but I haven’t yet found any Microsoft documentation suggesting you actually use those for anything.)
[1] https://ericlippert.com/2003/09/16/why-do-the-script-engines...
[2] https://piumarta.com/software/id-objmodel/
[3] https://dotat.at/@/2007-04-16-awash-in-a-c-of-objects.html