6

クライアント アプリケーションが (ATL ラッパーを使用して) c_com_ptr::CreateInstance を呼び出すと、COM サーバー LocalServer32 EXE が開始されます。

Windows 7 では、同じユーザー アカウントで実行されている 2 番目のクライアント アプリケーションも c_com_ptr::CreateInstance を呼び出すと、同じユーザー アカウントで実行されている EXE の 2 番目のコピーが起動されます。私は過去生から、2 番目のクライアントが最初の EXE を共有するという印象を受けていました。

LocalServer32 プロセスは共有されていますか? いつ、またはいつではないのですか?答えをグーグルで検索すると、ノイズと信号の比率が非常に大きくなり、答えが見つかりません。

私の CLSID レジストリ キーには、EXE パス、ProgID、Programmable (空の文字列)、TypeLib (GUID)、および VersionIndependentProgId を示す LocalServer32 値があります。AppID キーを持っています。

EXE をサービスとして実行したくありません。また、プロセスが共有されていなくてもかまいません。ルールを知りたいだけなので、何が期待できるかがわかります (Windows Server 2003 以降)。

編集: 以下の Chris の回答に従って、サーバーで CoRegisterClassObject 呼び出しを調べました。私は ATL を使用しており、MyServer::RegisterClassObjects をオーバーライドして CAtlExeModuleT::RegisterClassObjects への呼び出しチェーンにフックし、ATL が CLSCTX_LOCAL_SERVER と REGCLS_MULTIPLEUSE を使用していることを確認しました。

これを CLSCTX_LOCAL_SERVER および REGCLS_SINGLEUSE に変更すると、予想どおり、クライアントによって作成された COM オブジェクトの数に応じて、より多くのプロセスが開始されます。

それでも、REGCLS_MULTIPLEUSE に戻ると、COM クライアント プロセスごとに 1 つの COM サーバー プロセスが取得されます。各サーバー プロセスには、予想どおり、そのクライアントのすべての COM オブジェクトが含まれています。ただし、2 つの COM クライアントが同じユーザー アカウントで実行されている場合は、それぞれが私がREGCLS_MULTIPLEUSEを理解した方法ではない独自のサーバーを取得します。

違いは、クライアント自体が実際には Windows サービスであるということでしょうか? ユーザー アカウントとして実行されている Windows サービス プロセスが REGCLS_MULTIPLEUSE の下に COM オブジェクトを作成する場合、これは別の方法で処理され、観察された動作を引き起こしますか? 複数のプロセスが発生するのはなぜですか? (明確にするために、COM サーバーを Windows サービスとして実行したくありませんが、それを使用するクライアントはWindowsサービスとして実行します。)

また、ローカル システムまたはネットワーク サービスのいずれかとしてクライアントを実行すると、REGCLS_MULTIPLEUSE は予想どおりに機能します。単一の COM サーバー EXE プロセスのみが開始されます。複数のプロセスは、COM クライアントがユーザー アカウントで実行されている Windows サービスである場合に開始されます。

4

1 に答える 1

7

プロセス外アクティブ化要求のルーティングは、COM サービス コントロール マネージャーへのクラス オブジェクトの登録によって制御されます。SCM に使用可能な登録済みクラス オブジェクトがある場合、それが要求の処理に使用されます。そうでない場合は、COM サーバーの exe プロセス インスタンスを開始して取得します。したがって、複数のアクティベーション要求が単一の COM サーバー exe プロセスにルーティングされるかどうかは、少なくとも次の要因に依存します (これが完全なリストかどうかはわかりません)。

  • SCM に登録するために CoRegisterClassObject を呼び出すときに COM サーバーによって指定されたアクティベーション フラグにより​​、将来のアクティベーション要求によって新しい exe プロセス インスタンスが開始される可能性があります。最も単純で一般的なケースは、フラグ REGCLS_SINGLEUSE の使用です。単一のアクティベーションのみに使用されるクラス オブジェクト。
  • クラスの登録方法によっては、異なるセキュリティ コンテキストからのアクティブ化要求が、異なる COM サーバー exe インスタンスによって処理される場合があります (クライアント アプリケーションが同じセキュリティ コンテキストで実行されるため、これはシナリオには当てはまらないようです)。
于 2011-02-24T12:46:19.907 に答える