mfc dllにdllmainを追加する方法



  ウィザードでmfc付きdllを作成すると、dllmainがないことがわかります.ではdllmainをどう使うのでしょうか.下記の解説をご覧ください.参照はmsです.http://support.microsoft.com/kb/q148791/
設計により、MFCの一般的なdllは、MFCによって自動的に提供されるデフォルトのDllMain関数を有する.ルールdllは自分のDllMainを提供するべきではありません.必要なDLLロード時にInitInstanceメンバー関数の正規DLLのCWinApp派生クラスである任意の初期化.コードdeinitializationと終了コードはExitInstanceメンバー関数に転送する必要があります.ただし、InitInstanceの場合には、MFCのDllMainプロセスによってDLLに付加され、DLLから分離された場合にのみExitInstanceが呼び出されます.スレッドのアクセサリおよびMFCの従来のDLLにおけるスレーブ(DLL_THREAD_ATTACHおよびDLL_THREAD_DETACH)detachmentの従来のDLLを処理する必要がある場合、それ自体のDllMainを提供する必要がある.この操作の実行方法について説明します.
 
 
 
MFCソースは、通常のDLLの作成時にコードにリンクされるソースファイル/Msdev/Mfc/src/Dellmodul.cppを強制します.Dllmodul.cppは、DLLを従来サポートしているMFC DLLに追加されたコードの大部分を含む.Dllmodul.cppで最も重要な機能の1つはDllMain関数です.MFCのDllMainにコードを追加するには、/Msdev/Mfc/src/Dellmodul.cppソースファイルをプロジェクトディレクトリにコピーし、プロジェクトに含まれるコピーをコピーします.このDllmodul.cppは、DLLではなく、コンパイルおよびリンクされたMfc/srcディレクトリにDllmodul.cppが表示されるため、DllMainでの変更が最終的なDLLに表示されます.主に説明しなければならないのは、推奨されるソリューションではなく、絶対的に必要な場合にのみ使用することです.Dllmodul.cppのコードの変更は、予知できない結果をもたらすに違いありません.コードのみを追加、削除しない、または既存のコードを変更します.共有ライブラリでMFCを使用するルールdllについては、モジュールのステータスを追加したコードの先頭に設定し、DllMainから戻る前に復元する必要があります.処理DLL_についてTHREAD_ATTACHとDLL_THREAD_DETACHは、DllMainの一例を必要とする場合は、本明細書のサンプルコードを参照して、モジュールのステータスを正しく切り替えて通知します.DllMain DLL_に依存THREAD_ATTACHとDLL_THREAD_DETACHは、以下の条件で呼び出される場合、特に注意しなければなりません.
  • プロセス中にスレッドが作成された場合、システム呼び出しDllMain値はDLL_THREAD_ATTACHからプロセスへのdllの各マッピング.ただし、プロセスにいくつかの新しいDLLがマッピングされている場合、実行中のスレッドDllMainはDLL_を呼び出しません.THREAD_ATTACHと既存のスレッドの値.
  • DllMain呼び出しはDLL_の値を持つことはありません.THREAD_ATTACHのプロセスのメインスレッド.
  • (ExitThread呼び出しによる)スレッドが終了すると、DllMain呼び出しDLL_THREAD_DETACH値は、各dll DllMainに対してDLL_THREAD_DETACHとのいずれのスレッドも呼び出されない.ExitThread呼び出しによってあるスレッドが終了しない限り、
  • である.
  • あるスレッドがTerminateThread呼び出しによって終了した場合、DLL_THREAD_DETACHはDllMainを呼び出さない値である.
  • LoadLibraryロードDLL_PROCESS_ATTACHを呼び出す可能性があり、DllMain呼び出しDLLを呼び出し、スレッド終了によってdllMain呼び出しとDLL_THREAD_DETACHがこれまでDLL_THREAD_ATTACHを呼び出すことがなかった場合のプロセスにおけるスレッドを呼び出す可能性がある.したがって、これは最適なスレッド呼び出しLoadLibraryがFreeLibraryも呼び出す.
  • 注意:MFC CWndオブジェクト、CDCオブジェクト、CMenuオブジェクト、GDIオブジェクトおよびCImageListオブジェクトは、各モジュールの基礎となるスレッドごとに制限されます.また、モジュールまたはスレッド内のMFCオブジェクトを作成しても、異なるモジュールまたはスレッドで使用できないか、または使用できません.この項目は、DllMain DLL_THREAD_ATTACHまたは$を処理するDllMain DLL_THREAD_DETACH DllMain呼び出しに追加されます.CWndは、例えば、DllMain中にDLL_PROCESS_ATTACHまたはInitInstance中にDLL_THREAD_ATTACH期間を有効にしないオブジェクトを作成します.
     
    サンプルコード
    //////////////////////////////////////////////////////////////////// 
    // export DllMain for the DLL
    // Add code in the specified sections only.
    // Remove code at your own risk.
    extern "C"
    BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID
    /*lpReserved*/)
    {
       if (dwReason == DLL_PROCESS_ATTACH)
       {
    // ... Code abbreviated from DLLMODUL.CPP
       }
       else if (dwReason == DLL_PROCESS_DETACH)
       {
    // ... Code abbreviated from DLLMODUL.CPP
       }
    // NEW CODE ADDED HERE
    // -------------------
       else if (dwReason == DLL_THREAD_ATTACH)
       {
    #ifdef _AFXDLL
          // set module state
          ASSERT(AfxGetThreadState()->m_pPrevModuleState == NULL);
          AfxGetThreadState()->m_pPrevModuleState =
             AfxSetModuleState(AfxGetStaticModuleState());
    #endif
          // ADD DLL_THREAD_ATTACH CODE HERE
          // Remember that this won't necessarily be called for
          // every thread in the process into which this DLL is mapped
          // Threads created by the process BEFORE the DLL
          // was loaded will not call into DLL_THREAD_ATTACH.
    
    #ifdef _AFXDLL
          // restore previously-saved module state
         VERIFY(AfxSetModuleState(AfxGetThreadState()->m_pPrevModuleState)
                 == AfxGetStaticModuleState());
            DEBUG_ONLY(AfxGetThreadState()->m_pPrevModuleState = NULL);
    #endif
    
       }
       else if (dwReason ==DLL_THREAD_DETACH)
       {
    #ifdef _AFXDLL
          // set module state
          ASSERT(AfxGetThreadState()->m_pPrevModuleState == NULL);
          AfxGetThreadState()->m_pPrevModuleState =
             AfxSetModuleState(AfxGetStaticModuleState());
    #endif
          // ADD DLL_THREAD_DETACH CODE HERE
    
    #ifdef _AFXDLL
          // restore previously-saved module state
       VERIFY(AfxSetModuleState(AfxGetThreadState()->m_pPrevModuleState)
              == AfxGetStaticModuleState());
          DEBUG_ONLY(AfxGetThreadState()->m_pPrevModuleState = NULL);
    #endif
       }
    
       return TRUE;
    }