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は、以下の条件で呼び出される場合、特に注意しなければなりません.
サンプルコード
////////////////////////////////////////////////////////////////////
// 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;
}