実際に詳細な情報が欲しい場合は、マシン語の動作原理などを学ぶしかないと思います。
ぼくもそこまで詳しく分かっているわけではありませんが、DLLというのは各プログラムの
実行モジュールが確保しているメモリ空間とは別のWindowsが管理している共用(共通)の
メモリ空間内に読み込まれて使用されます。
(通常、普通のプログラムは仮想メモリ空間の0x00400000以降にロードされますが、DLLの
実行モジュールはバッティングしないようにロードされ、他の実行モジュール内から
呼び出されて実行されます)
http://yokohama.cool.ne.jp/chokuto/urawaza/mcn/index.html
実行ファイル(実行モジュール)とEXE、DLLなどについては静的リンクと動的リンクに
ついて調べてみてください。
ただ、完全に理解するのは難しいと思います(というかぼくも完全には理解できていない)。
かなり難しい内容ですが基本的な原理は以下のような感じになっています。
DLL内の実行モジュールはメモリ空間に読み込まれていない場合は新たに読み込まれますが
既に読み込まれていた場合は、何もしません。
LoadLibraryを使用する場合、使用する度にDLLの参照カウントと呼ばれるWindowsが
管理しているカウンターを+1します。
FreeLibraryを使用する度に参照カウントを-1します。
参照カウントが0以下になった場合、自動的にDLLの実行モジュールをメモリから解放
します。
GetModuleHandleを使用した場合、新たにDLLの実行モジュールをメモリ空間内にマップする
ようなことはせず、参照カウントも変化しません。
LoadLibraryを使用しているのにFreeLibraryを使用しなかったり、GetModuleHandleで取得
したモジュールハンドルをFreeLibraryした場合、参照カウントが狂うので誤動作の原因に
なります。