0

私は最近、シングルトン クラス ファクトリCOMを使用し、シングルトン オブジェクトとは異なる DLL に実装された他の COM オブジェクトへのポインターであるメンバーを持つオブジェクトで問題に遭遇しました。

これらの他の COM オブジェクトはシングルトン オブジェクトによって作成され、それがそれらへの唯一の参照でした。

シングルトン オブジェクトは、そのモジュールがアンロードされるまで決して破棄されないため、その時点で、他の COM オブジェクト (シングルトンのメンバー) が実装されている DLL が既にアンロードされている場合があり、その場合は、シングルトンがデストラクタでこれらのオブジェクトへの参照を解放したときにクラッシュしました。

他の COM オブジェクトを実装する DLL は、オブジェクトへの参照が保持されていることを認識し、S_FALSEそのDllCanUnloadNowメソッドから戻ります。

ただし、これは DLL が常にアンロードされるのを妨げているようには見えません。

シングルトン COM オブジェクト内の別の dll から COM オブジェクトへのメンバ ポインタを保持する安全な方法はありますか?

4

4 に答える 4

1

「間違った」モジュールのアンロード順序に苦しんでいる可能性が非常に高いです。DLL が「間違った」順序でアンロードされるのはなぜですか? を参照してください。詳細については。

于 2009-02-04T23:30:33.850 に答える
0

シングルトンが COM インターフェイスの実装を取得する場合、ポインターが取得されたときに、その実装で IUnknown::AddRef を呼び出す必要があります。

これらの参照を保持するシングルトンのフィールドにアクセスする場合も同様です。参照を取得したら、IUnknown::AddRef を呼び出し、完了したら IUnknown::Release を呼び出します。

このようにして、シングルトンがリサイクルされ、それが保持しているすべてのポインターが解放された場合、コードの別のセクションでそれらのいずれかを保持している場合、参照カウントをインクリメントしたため、インスタンスを失うことはありません。

参照カウントの管理に役立つCComPtr テンプレートの使用も検討する必要があります。

http://msdn.microsoft.com/en-us/library/ezzw7k98(vs.80).aspx

また、従わなければならない参照カウントのルールを確認することもできます。

http://msdn.microsoft.com/en-us/library/ms810016.aspx

「参照カウント規則」というタイトルのセクションを探します

于 2009-02-04T23:51:01.050 に答える
0

COM オブジェクトへのポインター (「参照の保持」とも呼ばれます) がある場合、その COM オブジェクトは解放するまで消えません。

COM オブジェクトが解放されていない場合、そのコードが実装されている DLL はアンロードされるべきではありません: DllCanUnloadNowを参照してください。

于 2009-02-04T23:23:51.180 に答える