[Howto]: 方法独自 MFC 標準 DLL 内の DllMain を提供します。

重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。

英語版 KB:148791
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
概要
仕様では、MFC 標準 Dll が用意されている既定の DllMain 関数があります。MFC によって自動的にします。標準 Dll は独自の DllMain を提供する必要があります。DLL が読み込まれると、必要な初期化を行う必要があります。1 つの CWinApp 派生クラスの InitInstance メンバー関数では、レギュラー DLL。必要があります deinitialization と終了コードを移動するのはExitInstance メンバー関数です。

ただし、initinstance 関数を処理するとき、MFC の DllMain でだけ呼び出されます接続 (DLL_PROCESS_ATTACH) DLL および ExitInstance だけと呼ばれますプロセス (DLL_PROCESS_DETACH を) DLL からデタッチします。ある場合スレッドの添付ファイルとの切り分けを処理するために必要です(DLL_THREAD_ATTACH と DLL_THREAD_DETACH) には通常、MFC レギュラー DLLDLL は、独自の DllMain を提供する必要があります。この資料で方法をについて説明します。そのためには。
詳細
レギュラー DLL の作成時に、MFC ソース コードで強制的にリンクします。ソース ファイル \Msdev\Mfc\Src\Dllmodul.cpp をします。Dllmodul.cpp にはほとんどが含まれています。レギュラー DLL の MFC をサポートするために DLL が追加のコードです。いずれか、Dllmodul.cpp で最も重要な機能は、DllMain 関数です。

MFC の DllMain にコードを追加するには、\Msdev\Mfc\Src\Dllmodul.cpp ソースをコピーします。プロジェクトのディレクトリに、ファイルし、そのコピーをプロジェクトに含めます。これDllmodul.cpp のコピーをコンパイルおよび DLL の代わりにリンクそのために、Dllmodul.cpp ディレクトリの Mfc\Src を変更に、DllMain 内最後の DLL 内に表示されます。

これは推奨されるソリューションではないとする必要があります主なコードサイズのです。どうしても必要な場合にのみ使用します。コードの変更Dllmodul.cpp は間違いなくと、予期しない結果があります。コードだけを追加して、操作を行います削除されませんまたは、既存のコードを変更します。

共有ライブラリで MFC を使用する標準 Dll のモジュール状態にする必要があります。追加したコードの先頭に設定してから返される前に復元DllMain。サンプル コードでは、この資料の例を参照してくださいにDllMain DLL_THREAD_ATTACH と DLL_THREAD_DETACH を処理します。通知し、モジュールの状態に応じてスイッチを正しくします。

その他に呼び出された DllMain を使用すると注意が必要DLL_THREAD_ATTACH と次のための DLL_THREAD_DETACH条件:

  • プロセスでスレッドが作成されると、システムが DllMain が呼び出されますがDLL_THREAD_ATTACH にマップされている Dll の各値は、プロセスです。ただし場合は、複数のスレッドで実行しているプロセスがある、プロセスとは新しい DLL にマップされて、DllMain で DLL_THREAD_ATTACH をという名前ではありません。既存のスレッドのいずれかの値です。
  • DLL_THREAD_ATTACH 値は、プロセスの DllMain が呼び出されないプライマリ スレッドします。
  • (ExitThread を呼び出して) スレッドの終了が DllMain を呼び出すDLL_THREAD_DETACH の値を各 Dll。 DllMain が呼び出されませんDLL_THREAD_DETACH ので、スレッドを終了しない限り、スレッドをExitThread を呼び出しています。
  • TerminateThread の呼び出しのためにスレッドが終了した場合は、DllMain ではありません。DLL_THREAD_DETACH 値が呼び出されます。
  • 読み込みの LoadLibrary の呼び出しには、プロセス内のスレッドは、DLL の DllMain への呼び出しを DLL_PROCESS_ATTACH を使用し、次に発生スレッドの終了、DLL_THREAD_DETACH が dllMain への呼び出しが発生します。今まで DLL_THREAD_ATTACH を呼び出さずに。したがって、最高は、LoadLibrary の呼び出しスレッドも FreeLibrary を呼び出します。
注: MFC の CWnd オブジェクト、CDC オブジェクト、CMenu オブジェクト、GDI オブジェクトされCImageList オブジェクトは、スレッドごとへ、モジュールごとの単位に制限されます。でつまり、1 つのモジュールまたはスレッドで作成した MFC オブジェクトが渡すことはできません。か、別のモジュールまたはスレッドで使用します。これは、特別な関連性があります。DLL_THREAD_ATTACH または DLL_THREAD_DETACH で処理するために追加するすべてのコードDllMain のような理由から別のスレッドが DllMain が呼び出されるため。DllMain 内 DLL_PROCESS_ATTACH で作成 CWnd オブジェクト、たとえば、または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;}				
関連情報
MFC オブジェクトのスレッド ローカルの詳細についてを参照してください、以下の資料は、マイクロソフト サポート技術。
147578CWnd の派生 MFC オブジェクトとマルチ スレッド ・ アプリケーション
モジュールの状態情報の詳細については、参照次してください。資料は、マイクロソフト サポート技術。
140850DLLTRACE は共有ライブラリで MFC を使用するに変換する方法
理由の詳細については DllMain 内のスレッドを作成必要はありません、以下の資料は、マイクロソフト サポート技術を参照してください。
142243PRB: DLL の起動時に MFC スレッドを作成できません。
DllMain DLL_THREAD_ATTACH DLL_THREAD_DETACH DLLMODUL。CPP RegDLL 4.00 dskbsweep

警告: この記事は自動翻訳されています

プロパティ

文書番号:148791 - 最終更新日: 12/04/2015 14:24:34 - リビジョン: 4.0

  • kbnosurvey kbarchive kbhowto kbarchitecture kbdll kbcode kbmt KB148791 KbMtja
フィードバック