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

文書翻訳 文書翻訳
文書番号: 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 スレッドを作成できません。

プロパティ

文書番号: 148791 - 最終更新日: 2011年7月4日 - リビジョン: 4.0
キーワード:?
kbhowto kbarchitecture kbdll kbcode kbmt KB148791 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:148791
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。
サポート期間が終了した「サポート技術情報」資料に関する免責事項
この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com