DllMain

2018/07/03

DllMainは、DLLにおけるエントリポイントで、DLLがロードされたり、解放されるたびに呼ばれる・・・。

DllMain 関数

第1引数は、DLLのインスタンスハンドルであり、これはDLLをロードする側のプログラムでLoadLibraryしたときの戻り値であるHMODULEと同じである・・・。
第2引数には、DllMainが呼び出された理由を表すマクロが格納されている・・・。
第3引数には、DLLが動的にロードされたか、静的にロードされたかが格納されている・・・。

今回は、ロードや解放時に第2引数に何が入っているかを確認する・・・。

DllMainプロジェクトを作成し、構成の種類を"ダイナミックライブラリ(.dll)"にしたら、
DllMain.cppを追加し、

と記述する・・・。

DLLをロードすると、呼び出し元プログラムのプロセスのメモリ空間に、DLLが配置(アタッチ)される・・・。
DLL_PROCESS_ATTACHは、この時に呼ばれたDllMainの第2引数fdwReasonに格納されている・・・。
逆に解放されるときは、配置が解除(デタッチ)されるので、DLL_PROCESS_DETACHが格納されている・・・。
DLL_THREAD_ATTACHは、現在のプロセスが、新しいスレッドを作成しようとするとき、格納されてDllMainが呼ばれる・・・。
新しいスレッドが作成され、そこからDLLが利用できるように初期化するためという意味がある・・・。
逆にスレッドが終了するときは、DLL_THREAD_DETACHが呼ばれる・・・。

前回のように、Mainプロジェクトを追加し、

"DllMain.dll"をロードし、解放する・・・。

実行すると、

LoadLibrary before.
DLL_PROCESS_ATTACH
hDll = 10000000
DLL_PROCESS_DETACH
FreeLibrary after.
続行するには何かキーを押してください . . .

ロードしたときに、DLL_PROCESS_ATTACHがfdwReasonに格納された状態でDllMainが呼ばれ、
解放したときに、DLL_PROCESS_DETACHがfdwReasonに格納された状態でDllMainが呼ばれていることがわかる・・・。

Sample/Main.cpp at master · bg1bgst333/Sample · GitHub
Sample/DllMain.cpp at master · bg1bgst333/Sample · GitHub