クライアント アプリケーションが (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 サービスである場合に開始されます。