投稿者 魔界の仮面弁士  (社会人) 投稿日時 2011/9/10 18:49:31
試したわけでは無いですが、私の認識としては:

・LoadLibrary 自体は、プロセスに対してマップされる。
・複数スレッドからの同時呼び出しに耐えられるかどうかは DLL 次第。
・同一プロセス上の複数のスレッドからそれぞれ LoadLibrary しても問題は無いが、
 ロードされる DLL のメモリ空間は、呼び出し元スレッドではなく、その親プロセスに配置される。

という認識ですね。


> スレッドを10個立てる場合に
DLL を複数のスレッドから呼び出せるかどうかは、ケースバイケースだと思います。
unlha32.dll などはマルチスレッドでの呼び出しに対応していませんし、一方で、
basp21.dll はマルチスレッド環境での利用を前提に設計されています。


たとえばその DLL がグローバル変数を利用していた場合、その変数は
LoadLibrary もしくは Declare した親プロセスのメモリ空間に配置されるので、
実行時には、親プロセスにとってのグローバル変数と同種の状況に置かれ、
結果としてスレッドセーフとはなりません。(呼び出し元で同期制御が必要)

複数同時に呼び出したいのであれば、マルチスレッドで動作させるのではなく、
マルチプロセスで扱った方が良いでしょう。あるいは、DLL を複数個用意するとか。

とはいえ、その DLL が同時利用不可なリソース(Clipboard や COM ポート等)を操作している場合には、
たとえマルチプロセスで動作させても並列動作とはならず、結局は同期制御が要求されることもあります。


以下はVB 側の話では無いですが、一応参考情報として。
http://support.microsoft.com/kb/118816/ja
http://www.sado.co.jp/system/taka/TLS/default.htm
http://konuma.txt-nifty.com/blog/2005/12/loadlibrary_5427.html
http://ruffnex.oc.to/kenji/text/dll_inj/
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200903/09030026.txt