Re: Threading Model (Both) and cross apartment calls
buddie84 <firstname.lastname@example.org> wrote:
FTM objects must never hold direct interface pointers to other objects
or proxies, instead FTM objects must the marshalled form of interface
Is this rule applicable to raw interface/proxy pointers ?
If I have an FTM object which have a VARIANT class member
(vt=VT_DISPATCH) holding an Interface pointer
will it be correctly marshaled across the aparatments without any work
from my side ?
No, you can't do that. A pointer created in apartment A can be
marshalled from A to B, but it's still illegal to simply move it to B
without marshalling, then try to marshal it from B to C (or even from B
to A). Just sticking it into a C structure (which is what VARIANT is, at
the end of the day) won't change that.
Marshalling occurs in three cases. First, it can be invoked explicitly
with things like CoMarshalInterface, GIT and so on. Second, if you call
CoCreateInstance and the server's apartment model does not match the
caller's, COM will create an object in the correct apartment and marshal
the pointer to yours. And third, if you have a proxy pointer and call a
method on it, any parameters are marshalled to the real object's
apartment, the call is executed, and any [out] parameters marshalled
back to the calling apartment.
Any other way of passing parameters around - by global variables,
attached to window messages, as a parameter to CreateProcess or similar,
and so on - don't cause marshalling. Often this results in violation of
With best wishes,
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925