別のアパートに住んでいるオブジェクトにオブジェクトを渡しましたか? もしそうなら、それを行う前にインターフェイスをマーシャリングする必要がありましたか? たまたまフリー スレッド マーシャラーを集約しましたか?
大まかに言えば、オブジェクトへのインターフェイスを別のアパートメント (スレッド) のオブジェクトに渡す場合は、必ずインターフェイスをマーシャリングする必要があります。そうしないと、呼び出しを正しく処理するプロキシを介して呼び出していないため、オブジェクトを他のアパートメントのオブジェクトから自由に呼び出すことができる場合があります。
オブジェクトへのすべての呼び出しは、そのスレッド (アパートメント内) で行う必要があります。オブジェクトを別のスレッドから直接呼び出すことは禁止されています。このフリースレッド方式でオブジェクトを使用すると、アプリケーションで問題が発生する可能性があります。この規則の意味するところは、オブジェクトへのすべてのポインターは、アパートメント間で受け渡されるときにマーシャリングする必要があるということです。COM は、この目的のために次の 2 つの関数を提供します。
* CoMarshalInterThreadInterfaceInStream marshals an interface into a stream object that is returned to the caller.
* CoGetInterfaceAndReleaseStream unmarshals an interface pointer from a stream object and releases it.
これらの関数は、MSHCTX_INPROC フラグを使用する必要がある CoMarshalInterface および CoUnmarshalInterface 関数への呼び出しをラップします。