ちょっと作りたいなーと思ったものがあって、でもそれはDLLでしか作れないので、DLLの作り方を勉強。
ついでにカスタムビルドというものの存在を初めて認識。
いや、存在は前から知ってたけど、何に使うものかさっぱり意識してなかったので(汗)
生成したDLLファイルを所定の場所にコピーするにはとっても便利♪
ちょっと作りたいなーと思ったものがあって、でもそれはDLLでしか作れないので、DLLの作り方を勉強。
ついでにカスタムビルドというものの存在を初めて認識。
いや、存在は前から知ってたけど、何に使うものかさっぱり意識してなかったので(汗)
生成したDLLファイルを所定の場所にコピーするにはとっても便利♪
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をロードしていなければたぶん大丈夫だと思うけど、どうなんだろう?
(たぶん、「絶対ロードしない」とは言い切れないだろうな~)
夜にブレーカーが落ちると真っ暗で困るよね…という無関係な話はさておき。
例によって今頃、ソードワールドRPGアドベンチャー(1994~1997)を読破。
「アレクラストでロックって何じゃい」と思ってたので昔はあんまり読んでなかったんだけど、序盤はともかく、2巻目以降の小ネタやストーリーは面白かった。スチャラカ冒険隊なんかもゲストで登場する(デルヴァの森の後日談や「かくもささやかな凱歌」の続き)し、もっと早く読んでおけばよかった~!