など、実行する必要があります同じDLLを使用している場合、各プロセスはそのDLLの静的(または "グローバル")データの専用コピーを取得します。
あなたがする必要があるのは、リストをDLL内のグローバル変数にして、すべてのアプリケーションからそのDLLにリンクするだけです。そうすれば、何か別のものを渡す必要はありません。
マルチDLLプロセスでオブジェクトが破壊される順序が予測できないため、リストの破壊をトラップするというのは困難です。
main
またはWinMain
機能の最後にリストの内容をダンプする方がはるかに簡単です。
スマートポインタクラスを一貫して使用していない場合は、そうするようにしてください。また、循環参照カウントを探す価値があるかもしれません。オブジェクトAはオブジェクトBにカウントを持っています。これは、リリースされていないオブジェクトの一般的な原因です。
更新:
実行して、オブジェクトを解放するために、すべての静的デストラクタを強制するには、あなたが、あなたは、あなたのアプリケーション特定の方法を構築する必要があります、その後、リスト内のエントリを調べることができます。
プロセスを起動する非常に最小限のEXEがあり、実際にすべての作業を実行する他のDLLが多数ロードされているとします。これらの他のDLLは、何とか(おそらくCOMまたはCOMライクなシステムによって)LoadLibraryによってロードされます。 LoadLibrary APIは、DLLをプロセスにロードするか、DLLがすでにロードされている場合はDLLの内部参照カウンタをインクリメントして動作します。 FreeLibrary APIは、カウンタがゼロになるまでカウンタをデクリメントしてから、DLLをアンロードします(その時点で、そのDLLの静的デストラクタが実行されます)。
ここで、未処理の参照カウントされたすべてのオブジェクトのリストを保持する診断DLLを追加します。他のすべてのDLLは、診断DLLへのimport-libリンケージを使用し、EXEも同様にLoadLibraryを使用します。
main
が終了しようとすると、EXEは以前にロードしたDLLハンドルのリストを調べ、それらのすべてでFreeLibraryを呼び出します。診断DLLをロードしたままにすることで、それが最後にまだ存在することを保証します。それは少なくとも理論です。
しかし、他のDLLはどの順序でアンロードする必要がありますか? A.DLLにB.DLLで定義されたオブジェクトへの静的ポインタがある場合は、まずAをアンロードする方がよいでしょう。したがって、さまざまなDLLがどのように「レイヤード」アーキテクチャを形成しているかを知る必要があります。下位レイヤに応じて上位レイヤが配置されるため、アンロードする順序が安全です。
また、一度すべてのDLLをアンロードすると、DLL内のオブジェクトを参照する診断リスト内のエントリは、ヒープ上の有効なデータを指すようになりますが、vtableは定義されたコードを指しています現在アンロードされているDLLによって、これらのオブジェクトで仮想関数を呼び出すことはできません。あなたは彼らのデータを調べることができるはずです。
ご自身のご質問はありますか? –