1

アウトプロセス環境で COM アパートメントを理解するのに苦労しています。

CoInitializeEx基本的に、クライアントが自分のスレッドをアパートに登録するために呼び出す必要がある理由がわかりません。サーバー スレッドが使用するオブジェクトと、STA または MTA に存在するサーバー スレッドを理解できます。しかし、なぜクライアントがこれについて心配する必要があるのか​​ 理解できません。

すべてのドキュメント/ガイドには、クライアントがCoInitializeExアパートに登録するために電話する必要があると書かれています。これは、サーバーがクライアントのスレッドを追跡しているということですか? それとも、クライアント プロセスにもアパートメント データが割り当てられているのでしょうか。

4

2 に答える 2

2

アウトプロセス サーバーに存在する COM オブジェクトは、実際には 2 つの部分で構成されています。サーバー内の実装コードと、コンパイラと COM ランタイムによって作成された RPC プロキシ/スタブ コードです。リモート COM オブジェクトの呼び出しは、ローカル プロキシ オブジェクトへの呼び出しに変換されます。ローカル プロキシ オブジェクトは、RPC メカニズムを使用して、その呼び出しをマーシャリングし、メッセージとしてサーバー プロセスに送信します。メッセージは、実際の COM オブジェクトを呼び出すサーバーのスタブによって取得され、結果をプロキシにマーシャリングして戻します。プロキシはそれをアンマーシャリングして、呼び出し元のクライアント コードに返します。クライアントと COM オブジェクトの両方の観点から、DCOM の場合のようにネットワーク経由で発生した場合でも、すべての呼び出しはローカルです。

現在、クライアントのプロキシは通常の COM オブジェクトのように動作し、ある種のアパートメントに常駐する必要があります。サーバー内の COM オブジェクトも独自のアパートメントに存在します。COM では、クライアントとサーバーが異なるスレッド モデルを持つことができ、適切な同期を処理できます (2 つの相互運用コードが異なるプロセスに存在する場合、これは非常に簡単です)。

MSDN の COM ガイドのプロセス、スレッド、およびアパートメントの部分を読んで、どれが何であり、どのように相互接続されているかをよりよく理解することをお勧めします。

于 2012-05-25T19:17:51.690 に答える
1

スレッドを追跡するのはサーバーではなく、特定のアパートメントにスレッドを接続する COM です。また、スレッドを所有するのはクライアントであるため、STA または MTA を作成するのはクライアントの選択です。

クライアントがスレッドに必要なアパートメント モデルを選択すると、COM は特定の呼び出しをどのように正確に満たすかを決定します。COM クラスが MTA でのみ実行するように登録されていて、クライアントのスレッドが STA である場合、COM はワーカー MTA スレッドで実際のオブジェクトを作成し、そのインターフェイスをクライアントの STA にマーシャリングする必要があります。

クライアントは操作モードを選択し、COM はサーバーの登録と共にそれをすべて取得します。

于 2012-05-25T18:28:01.920 に答える