Last Updated 2002/03/02 |
Programming Tips Windows COMMポート | 索 引 |
通信APIのハングアップ
2002/03/02
通信APIがハング VisualStudio97 の CD-ROM1枚目 \devstudio\vc\samples\sdk\win32\comm のサンプルの疑問. このサンプルでは CreateFile で OVERLAPPED を指定していて,ReadFile と WriteFile にも OVERLAPPED を指定しているが,WaitCommEvent には OVERLAPPED を指定していない. これでも問題なく動いているようだが,オンラインヘルプの WaitCommEvent には, If hFile was opened with FILE_FLAG_OVERLAPPED, the lpOverlapped parameter must not be NULL. It must point to a valid OVERLAPPED structure. If hFile was opened with FILE_FLAG_OVERLAPPED and lpOverlapped is NULL, the function can incorrectly report that the operation is complete. と書いてあり,このサンプルは API の仕様に反することをやっているようだ. それで不安になったので「Windows95通信プログラミング」の Ex3-4 を参考にしたら..... (こちらはOVERLAPPEDの指定は全て無し) Windows95通信プログラミング(アスキー)のサンプルプログラムの \Chapter3\Ex3-4\Code34.exe にて,メニューの [Settings]-[Configure] を実行するとハングアップする. また,単に何かキーを押す(送信する)だけでもハングアップする. 調べてみると,GetCommConfig 及び WriteFile でハングアップしているようだ. この現象は NT4.0 では起きるが 95 では起きない. WaitCommEvent でイベント待ちの状態で何か通信 API をコールしたときにハングアップするようだ. WaitCommEvent を使わなければ同じ API でもハングアップしない. TAPIでは,通信ハンドルを非同期で開く. (モデムのネゴシエーションが確立しコネクトした後の得られるハンドル) 従って,WriteFile(), ReadFile() の最後の引数を NULL にするのは,正当ではない.Windows95 では、最後の引数を NULL であたかも同期の様に動作するが,NT では失敗におわる.
上記の様にするとあたかも同期動作の様に振る舞える. VisualStudio97のサンプル \devstudio\vc\samples\sdk\win32\tapi\tapicomm がかなり参考になりそう. 参照 |
|