まじめふまじめ--俺がまじめふまじめだ!
昨日のEchoサーバーもどきのサンプルはVS2008でWin32 コンソール アプリケーションとしてビルドして一応動作したのだが、流れでReleaseビルドでしかテストできていなかったのでDebugビルド時に起きる不具合を見逃したorz
CSocket::Create()からMFCの初期化依存のコードが呼ばれており、Debugビルドだとその中で
ASSERT(afxCurrentInstanceHandle != NULL);
に引っかかってしまう。これを無くすには、メインルーチンtmain()の冒頭にMFCの初期化コードを追加せねばならない。
例:
/// メインルーチンです。 int _tmain(int argc, _TCHAR* argv[]) { if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { ERR("AfxWinInit()失敗"); return -1; } /*(省略)*/ }
逆に、上の書き方でいいという根拠はMSDN2のサンプルコード(下記↓)
AfxWinInit (MFC)
なお、参考にした
http://www.computer-shogi.org/protocol/WinSample07Jan.lzh
のreadme.txtにはAfxSocketInit()で初期化するようにという注意書きはあったが、(CSocketを使いたいだけなのに)AfxWinInit()も呼ばねばASSERT()に引っかかるということまでは書いてなかったから今回の件は堪忍ですじゃ