2

私は静的のファンではありませんが、次のようなコードがあります。

他に何かがなければ、静的破壊は失敗します。static は、DLL クラス内のメンバーとして宣言されます。

実行可能ファイルがシャットダウンされるため、ランタイムは FreeLibary を呼び出して、起動時にロードした DLL を解放します。

プログラムの終了時に static が破棄されることはわかっていますが (構築順序の保証がなかったため、破棄順序の保証はありません)、いつ破棄の準備が整いますか? 私のDLLMain(ロードされたDLLの)終了後、またはランタイムの後、__DllMainCRTStartupまたはこの後でも?

破壊する前に何かをする機会があるかどうかを知りたいだけです。そうでない場合は、静的なものをより適切なものに削除することを検討する必要があります。

4

3 に答える 3

2

おそらくatexit関数が役に立ちます。プロセスのデタッチ中にランタイムによって実行されるコールバック関数を指定します。

DLL の説明: http://msdn.microsoft.com/en-us/library/988ye33t.aspx

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

于 2012-09-21T05:44:57.613 に答える
1

あなたの質問から、あなたが Windows を使用していて、Microsoft コンパイラを使用していることがわかります。私の答えはこの設定に固有のものです(gccが似ていると確信していますが)。

簡単な答えは次の
とおりです。あなたの DLL が周りにあり、別の DLL に依存しており、物事を台無しにしない限り (たとえば、依存関係を FreeLibrary にしないなど)、依存関係の DLL はメモリ内に残ります。動作状態、および呼び出すことができます。依存 DLL のシャットダウン シーケンスは、DLL が完全にシャットダウンされた後にのみ開始されます。

Microsoft Visual Studio でコンパイルされた DLL のシーケンス順序:

  • DllMainCRTStartup は、DLL のエントリ ポイントです。このメソッドのコードは、c:\program files\Microsoft Visual Studio 11.0\VC\CRT\src\crtdll.c にあります。
  • DllMainCRTStartup は CRT_INIT を呼び出します (同じファイル)。
  • DLL_PROCESS_ATTACH には、あらゆる種類の初期化があります。次に、関数inittermを呼び出します。この関数 (他の場所で実装されています。以下を参照) は、すべての静的 C++ オブジェクトのコンストラクターを呼び出す関数です。
  • DLL_PROCESS_DETACH では、CRT_INIT が破棄を行う一連の oneexit/atexit ルーチンを呼び出します。
  • CRT_INIT を呼び出した後、DllMainCRTStartup はユーザー定義の DllMain を呼び出します。
  • terminit は crt0dat.c に実装されています。ループ内で呼び出される関数 (コンパイラとリンカによって生成される) へのポインタの配列があります。各関数は、静的オブジェクトのコンストラクターです。
于 2012-09-19T15:02:04.627 に答える
0

CoInitilizeこれを回避する別の可能な方法は、コンストラクターが単純に呼び出し、デストラクターが呼び出すグローバルクラスを持つことだと思いますCoUninitilize

次に、このグローバルが、たとえば a を含むオブジェクトの前に作成されていることを確認してComPtrください。破壊は構築の逆になるので、 を呼び出すデストラクタは が呼び出されたCoUninitilize後に発生します。.ReleaseComPtr

于 2012-09-21T10:19:41.067 に答える