ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

winsockのWSAStartupはDllMainから呼び出していいのか?

2006-07-27 20:35:36 | PG(ソケット通信)

winsockを使って通信をするサンプルを作る為に自分のウェブページのソースをコピペしてみたら、コンパイルエラーになる部分があったので修正。
(rmaskの「r」が全角文字になってたとか、soc+1はキャストが必要とか、インクルードするヘッダーはwinsock.hじゃなくてwinsock2.hの方がいいとか(爆))


ところで、今回はこれをDLL化しようとしたんだけど、winsockの場合は他の言語のライブラリと違って最初に一回だけWSAStartupで初期化し、最後にWSACleanupでクリーンアップしなければならない。

DLLの場合、ロード時や終了時にDllMainが呼ばれ、その第二引数の値によって どの時点で呼ばれたかが分かる。
なので、DLL_PROCESS_ATTACHで呼ばれたときにWSAStartupし、DLL_PROCESS_DETACHで呼ばれたらWSACleanupをすればちょうどいいじゃん!
と思ったんだけど。

マイクロソフトのSDKのページ.NETとの混在DLLのページにある制限事項を見ると、DllMainでは別DLLをロードしたり解放したりするようなことは禁止であり、問題が発生しうる例としてソケット関数呼び出しがバッチリ挙げられていた(泣)
自分で試した限りではとりあえず動いたし、DllMainでWSAStartupを呼び出している例もウェブ上で見かけたが…いいんだろうか。WSAStartupがDLLをロードしていなければたぶん大丈夫だと思うけど、どうなんだろう?
(たぶん、「絶対ロードしない」とは言い切れないだろうな~)



最新の画像もっと見る

1 コメント

コメント日が  古い順  |   新しい順
Unknown (Unknown)
2012-12-25 17:39:15
気にするな!明日は明るい!
返信する

コメントを投稿