Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
DLLのリロードについて
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=10417#CommentId21446
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
魔界の仮面弁士
 (社会人)
投稿日時
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