Windowsにおける共有ライブラリはDLL(Dynamic Link Library)と呼ばれ、拡張子が".dll"のファイルである・・・。
LoadLibraryは、そのDLLを動的にロードするWindowsAPI・・・。
DLLを作成し、そのDLLを他のプログラムからLoadLibraryでロードしてみる・・・。
まず、
Win32プロジェクトでLoadLibraryプロジェクトを作る・・・。
空のプロジェクトで・・・。
LoadLibrary.cppを追加し、
DllMain関数の定義を書く・・・。
このDllMainが、DLLがロードされたときのエントリポイントとなる・・・。
"DllMain"と出力して、TRUEを返すだけ・・・。
そして、
プロパティの[構成の種類]で"アプリケーション(.exe)"になっているのを"ダイナミックライブラリ(.dll)"に変更する・・・。
これでビルドすると、
LoadLibrary.dllができる・・・。
新たにMainプロジェクトを追加し、ソースコードMain.cppを追加したら、そこにLoadLibrary.dllをロードする処理を書く・・・。
DLLのハンドルは、HMODULE型のhDllに格納・・・。
まだDLLがロードされる前・・・。
LoadLibraryで"LoadLibrary.dll"をロード・・・。
戻り値のハンドルはhDllに・・・。
このあと、ロードに成功すれば、LoadLibrary.cppのDllMainが実行される・・・。
hDllがNULLならロード失敗・・・。
hDllの値を出力・・・。
不要になったらFreeLibraryで解放・・・。解放するDLLのハンドル(この場合、"LoadLibrary.dll"を指すhDll)を指定する・・・。
最後に"FreeLibrary after."を出力・・・。
Mainをスタートアッププロジェクトに・・・。
([プロジェクトの依存関係]は設定しない・・・。)
ビルドして実行すると、
LoadLibrary before. DllMain hDll = 10000000 DllMain FreeLibrary after. 続行するには何かキーを押してください . . .
"DllMain"が出力されているし、hDllも取得できているので、LoadLibrary.dllがロードできている・・・。
最初の"DllMain"はLoadLibraryでロードされた時・・・。
2番目の"DllMain"はFreeLibraryで解放された時に出力されたものである・・・。
つまりDLLがロードされたり、解放されるたび、DllMainが呼ばれるのである・・・。
Sample/Main.cpp at master · bg1bgst333/Sample · GitHub
Sample/LoadLibrary.cpp at master · bg1bgst333/Sample · GitHub