私はこの問題を数日間苦労しています。私は最終的にはうまくいくソリューションを見つけました。私の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を呼び出す必要があります。
私の理論は、登録がパブリックビューから削除されたため、それ以降のインスタンス化のために新しいプロセスが作成されるということです。
このソリューションでは、すべてのインスタンスが1つのDLLHOSTプロセスに存在しませんか?むしろ、それは非常に独自の私的なプロセスを持っている各インスタンス? – leiflundgren
それは、私がクラス工場についての私の言いたいことが意味するところです。ファクトリがアウトオブプロセスサーバーに登録されている場合は、CoCreateInstanceに複数回応答するかどうかを指定できます。それ以外の場合は、新しいサーバーが起動されます。 http://msdn.microsoft.com/en-us/library/ms679697(VS.85).aspxを参照してください。 REGCLS_SINGLEUSEが必要です。あなたが使用したいREGCLSをDLLHOSTに指定することができれば疑問です。私はわかりません。 –
ああ、とても戸惑うように聞こえる。 今回は回避策で解決しました。 しかし、 "次回"私はこれをもっと見るべきです。 ありがとう! – leiflundgren