2009-08-17 22 views
2

COMインスタンスを専用のホストプロセスで作成することは可能ですか?各COMインスタンスを独自のEXEコンテナに作成する

私はいくつかの背景が必要だと思います。

シングルトンCOMオブジェクト内に中央論理コンポーネントを持つエンドユーザークライアントがあります。 (プロッパシングルトンではなく、グローバル変数を内部的に使用するため、失敗する)exeファイルごとに1つのインスタンスしか存在しないようにする。クライアントを作る際に便利です。

しかし、サーバー側をテストするための "クライアントシミュレータ"を作成する必要があります。したがって私はクライアントコンポーネントのインスタンスを20個作成します。 各インスタンスを独自のexe-hostにインスタンス化できる場合、シングルトン問題が処理されます。

よろしく レイフ

答えて

2

This other questionがどのようにの説明を述べたことを、IPC(プロセス間通信)が必要です http://support.microsoft.com/kb/198891

私はこれを自分で試したことはありませんし、ファクトリのフラグを指定できればわかりません(複数のオブジェクトに対してサロゲートを再利用できるかどうかを制御します) DCOMCNFGやOLEVIEWを使って調整することもできます。

+0

このソリューションでは、すべてのインスタンスが1つのDLLHOSTプロセスに存在しませんか?むしろ、それは非常に独自の私的なプロセスを持っている各インスタンス? – leiflundgren

+2

それは、私がクラス工場についての私の言いたいことが意味するところです。ファクトリがアウトオブプロセスサーバーに登録されている場合は、CoCreateInstanceに複数回応答するかどうかを指定できます。それ以外の場合は、新しいサーバーが起動されます。 http://msdn.microsoft.com/en-us/library/ms679697(VS.85).aspxを参照してください。 REGCLS_SINGLEUSEが必要です。あなたが使用したいREGCLSをDLLHOSTに指定することができれば疑問です。私はわかりません。 –

+0

ああ、とても戸惑うように聞こえる。 今回は回避策で解決しました。 しかし、 "次回"私はこれをもっと見るべきです。 ありがとう! – leiflundgren

2

マイCOMの日はとっくにいなくなって、しかし、私が覚えている限りでは、それを行うには、組み込みの方法はありませんされています。

それはCOMと1プロセスあたりのインスタンスルートを移動するよりも、複数のインスタンスをサポートしていますが、ここでですので、あなたのコードを書き換えることが容易であるかもしれない、あなたは何ができるか:

  • 使うスレッドローカルグローバル変数の格納と、別のCoClassを作成します。各インスタンスは、グローバル変数を持つクラスへのアクセスがマーシャリングされる独自のスレッドを所有します。これにより、少なくともDCOMのパフォーマンスへの影響を避けることができます。

  • COMインスタンスをホストするために、独自のアウトプロセスexeサーバー(WindowsのDllHost.exeと同様)を作成します。あなたはどちらか何かを自分でコーディングする必要がありますのでこれはマーシャル外部プロセスの呼び出しやDCOMを使用します(あなたのCOMオブジェクトを推定するのIDispatchを実装)

+0

ヒント 「魔法の鍵」をもう少し多く「魔法のように」する前に、私はそれを望んでいます。 – leiflundgren

1

私はこの問題を数日間苦労しています。私は最終的にはうまくいくソリューションを見つけました。私のCOMオブジェクトはATLを使用して記述されていますので、私のコードスニペットはその方​​向に向いていますが、技術的な解決策は明らかです。クラスオブジェクトがどのように登録されるかについては、すべてがヒンジします。 REGCLS_SINGLEUSEフラグがキーです。私は今、オブジェクトインスタンスごとに別々のプロセスを持っています。ATLモジュールにおいて

、次のようにRegisterClassObjects()関数をオーバーライド:

HRESULT RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags) throw() 
{ 
    return base::RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_SUSPENDED | REGCLS_SINGLEUSE); 
} 

MSDNからREGCLS_SINGLEUSEに関する:

REGCLS_SINGLEUSE

アプリケーションが接続された後クラスオブジェクトに CoGetClassObject、クラスオブジェクトが公開ビューから削除され、 他のアプリケーションは接続できません。この値は、通常、シングルドキュメントインターフェイス(SDI)アプリケーションの場合に で使用されます。この の値を指定すると、オブジェクトアプリケーションの責任に影響しません。 CoRevokeClassObjectを呼び出します。 がオブジェクトクラスで終了したときに常にCoRevokeClassObjectを呼び出す必要があります。

私の理論は、登録がパブリックビューから削除されたため、それ以降のインスタンス化のために新しいプロセスが作成されるということです。

関連する問題