MikoĊaj Zalewski wrote:
The number of developers that understand COM aggregation and all the
baroque rules that make it up is very, very low. A simple ops struct of
function pointers as used in the wineserver or kernel would be fine here
... COM adds an awful lot of complexity that really isn't needed at all
(eg you must call CoInitialize, which means caring about apartments,
which
means possibly instantiating a STA when windows wouldn't, which means
pain).
OK, I won't insist on aggregation :). As for apartments I've thought
that something like that:
HRESULT res=CoInitializeEx(NULL, COINIT_MULTITHREADED);
/* working with objects with ThreadingModel Both */
if (SUCCEEDED(res)) CoUninitialize();
won't have any side effects. But if the number of developers that
knows about COM is low then maybe that it's better to use simple ops
structs instead.
As long as the lifetime of the objects doesn't outlive the lifetime of
the apartment (which dies in the CoUninitialize call) then it is fine,
although trying to change the apartment of the current thread will cause
builtin ole32 to print an ERR at the console.
--
Rob Shearman