Sorry, we are pretty much stuck on the single-threaded apartment model for various reasons:
OLE is not threadsafe and therefore only supports the STA. If we use the MTA in CoInitializeEx(), all PB functions which rely on OLE will fail. (Drag & Drop, Clipboard and some others).
See remarks here:
http://msdn.microsoft.com/en-us/library/ms695279.aspx
Also, most of the Shell related functions and other COM related functions that have something to do with user interfaces pretty much require the single threaded apartment to work. Using the MTA would mess up a ton of things there.
See here:
http://support.microsoft.com/kb/287087
http://blogs.msdn.com/oldnewthing/archi ... 01378.aspx
Btw, single threaded apartment does not mean that threads cannot be used. It only means that interface calls across threads are not possible. So automatically switching to the MTA with the threadsafe setting is not needed as the STA works well with thread. Just not for cross-thread object calls.
You may want to look at the CoMarshalInterThreadInterfaceInStream() and CoGetInterfaceAndReleaseStream() functions (killer function names btw

). They allow an interface pointer to be marshaled to a different thread, so the other thread can make calls on the object as well. I have not used these myself yet, but the description looks like they are pretty straight-forward to use.