LoadLibrary

Windowsにおける共有ライブラリはDLL(Dynamic Link Library)と呼ばれ、拡張子が".dll"のファイルである・・・。
LoadLibraryは、そのDLLを動的にロードするWindowsAPI・・・。

LoadLibrary 関数

DLLを作成し、そのDLLを他のプログラムからLoadLibraryでロードしてみる・・・。

まず、

f:id:BG1:20151031210814p:plain

Win32プロジェクトでLoadLibraryプロジェクトを作る・・・。

f:id:BG1:20151031210917p:plain

空のプロジェクトで・・・。

LoadLibrary.cppを追加し、

DllMain関数の定義を書く・・・。
このDllMainが、DLLがロードされたときのエントリポイントとなる・・・。
"DllMain"と出力して、TRUEを返すだけ・・・。

そして、

f:id:BG1:20151031211622p:plain

プロパティの[構成の種類]で"アプリケーション(.exe)"になっているのを"ダイナミックライブラリ(.dll)"に変更する・・・。

これでビルドすると、

f:id:BG1:20151031212011p:plain

LoadLibrary.dllができる・・・。

f:id:BG1:20151031212210p:plain

新たに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."を出力・・・。

f:id:BG1:20151031213620p:plain

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